perm filename VDPSER.XGP[SS,SYS] blob
sn#474585 filedate 1979-09-05 generic text, type T, neo UTF8
/FONT#0=FIX20.FNT[XGP,SYS]
/BMAR=1
/TMAR=128
/RMAR=1699
/LMAR=128
/PMAR=2065
/XLINE=3
SAIL ME 14:47:01 Wednesday, September 5, 1979 FQ+6D.17H.26M.27S.
VDPSER.NEW[S,SYS] Created 13:49 Wednesday, September 5, 1979 FQ+6D.16H.28M.26S.
VVV VVV DDDDDDDDD PPPPPPPPPPPP SSSSSSSSS EEEEEEEEEEEEEEE RRRRRRRRRRRR
VVV VVV DDDDDDDDD PPPPPPPPPPPP SSSSSSSSS EEEEEEEEEEEEEEE RRRRRRRRRRRR
VVV VVV DDDDDDDDD PPPPPPPPPPPP SSSSSSSSS EEEEEEEEEEEEEEE RRRRRRRRRRRR
VVV VVV DDD DDD PPP PPP SSS SSS EEE RRR RRR
VVV VVV DDD DDD PPP PPP SSS SSS EEE RRR RRR
VVV VVV DDD DDD PPP PPP SSS SSS EEE RRR RRR
VVV VVV DDD DDD PPP PPP SSS EEE RRR RRR
VVV VVV DDD DDD PPP PPP SSS EEE RRR RRR
VVV VVV DDD DDD PPP PPP SSS EEE RRR RRR
VVV VVV DDD DDD PPPPPPPPPPPP SSSSSSSSS EEEEEEEEEEEE RRRRRRRRRRRR
VVV VVV DDD DDD PPPPPPPPPPPP SSSSSSSSS EEEEEEEEEEEE RRRRRRRRRRRR
VVV VVV DDD DDD PPPPPPPPPPPP SSSSSSSSS EEEEEEEEEEEE RRRRRRRRRRRR
VVV VVV DDD DDD PPP SSS EEE RRR RRR
VVV VVV DDD DDD PPP SSS EEE RRR RRR
VVV VVV DDD DDD PPP SSS EEE RRR RRR
VVV VVV DDD DDD PPP SSS SSS EEE RRR RRR
VVV VVV DDD DDD PPP SSS SSS EEE RRR RRR
VVV VVV DDD DDD PPP SSS SSS EEE RRR RRR
VVV DDDDDDDDD PPP SSSSSSSSS EEEEEEEEEEEEEEE RRR RRR
VVV DDDDDDDDD PPP SSSSSSSSS EEEEEEEEEEEEEEE RRR RRR
VVV DDDDDDDDD PPP SSSSSSSSS EEEEEEEEEEEEEEE RRR RRR
SAIL ME 14:47:01 Wednesday, September 5, 1979 FQ+6D.17H.26M.27S.
VDPSER.NEW[S,SYS] Created 13:49 Wednesday, September 5, 1979 FQ+6D.16H.28M.26S.
NNN NNN EEEEEEEEEEEEEEE WWW WWW
NNN NNN EEEEEEEEEEEEEEE WWW WWW
NNN NNN EEEEEEEEEEEEEEE WWW WWW
NNNNNN NNN EEE WWW WWW
NNNNNN NNN EEE WWW WWW
NNNNNN NNN EEE WWW WWW
NNN NNN NNN EEE WWW WWW
NNN NNN NNN EEE WWW WWW
NNN NNN NNN EEE WWW WWW
NNN NNNNNN EEEEEEEEEEEE WWW WWW WWW
NNN NNNNNN EEEEEEEEEEEE WWW WWW WWW
NNN NNNNNN EEEEEEEEEEEE WWW WWW WWW
NNN NNN EEE WWW WWW WWW
NNN NNN EEE WWW WWW WWW
NNN NNN EEE WWW WWW WWW
NNN NNN EEE WWWWWW WWWWWW
NNN NNN EEE WWWWWW WWWWWW
NNN NNN EEE WWWWWW WWWWWW
NNN NNN EEEEEEEEEEEEEEE WWW WWW
NNN NNN EEEEEEEEEEEEEEE WWW WWW
NNN NNN EEEEEEEEEEEEEEE WWW WWW
Switch Settings: L[FAIL] % C -J 5000S 3V 81V 120W X ↑
Fonts: F[FIX20.FNT[XGP,SYS],,]
LREC File: SAIL:VDPNEW.LRC[SS,SYS]
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 1␈↓'α
001 COMMENT ⊗ VALID 00018 PAGES
002 C REC PAGE DESCRIPTION
003 C00001 00001
004 C00005 00002 RECDM RECDM0 RECDM8 RECDM5 RECDM3 RECDM9 RECDM4 RECDM6 RECDM2 RECDM7
005 C00011 00003 RECNED RECNER RECNNE RECNSP RECQNC RECQSP RECQVC RECNNQ RECNEC RECNE2 RECNEQ RECNEA RECN
EZ RECNEN RECNEE RECNES NECLR NEFLSH NEHOLD NEHOL1 NEUNH NEC600 RECNEM RECNM1 RECNM2 RECNM3 MACMAX CHRMA
C CHRMA1 CHRMA2 CHRMA3 CHRMA6 CHRMA7 CHRMA0 CHRMA4 CHRMA5 CHRMA8 CHRMA9 GETMAC GETMA1 DMMODE DMMODN DMMO
D0 DMMOD1 DMQESC DMQES2 NOEDFL NEHTFL NEALLQ NEQMOD NEMMOD NECMOD NENUMB NEQUOT NEMETA NECTRL NETBPT NEB
BPT NESBPT NEMBPT NECNUM NECQUO NECDSP NECCNV NECSUP NECVEC VECTNM NECHAR NECVBP CHRMAC GETMAC
006 C00038 00004 TBSSET RAPPED NOINTR DMBPND LEWAIT DMSTAY DMXCAL DMQUOT TRUNCA NOEEOL NOEEOB BETWEE USER
GO CHASTE PROTLE DMATXY DMXLE QUO177 DMUXFR BLNKON PROTON IDON DMUMSK CTRLCH DMTAPE
007 C00045 00005 DMTABL dispatch table for quoted DM control characters
008 C00052 00006 PADID DM128 NO177 NOBOLD NODICU NBTSEQ DM2500 HP2648 TELERAY
009 C00066 00007 DMXMT DMXMG2 DMXMGO DMXMT0 DMXMTP DMXDEQ DMXMT1 DMXMT9 DMXMT2 DMXM8L DMXM8C DMXM8U DMNOX
Y DMXMT8 NODPYH NODPYH
010 C00075 00008 XYGET XYGET2 XYCHK DMSETQ
011 C00077 00009 DMXMTL DMXMUS DMXMTO DMXMTM DMLEM5 DMXMT6 DMXMT3 DMXMT5 DMTAB3 DMNOOP DMNOO2 DMXM5A DMXM
5B DMXM5X DMCR2 DMLF4 DMXM5D SKIPCR RANGE0 RANGE
012 C00086 00010 IGNOR0 IGNOR3 IGNOR2 IGNFF DMMAST DMERAS DMHOME DMBACK DMFOR2 DMFORW DM175 DM177B
013 C00092 00011 DMXMT7 DM177 DMXM4A DMXMT4 DMCALC DMBELL DMCHPD DM30PD DM30PA DM30PB DM25PA DM25PB DMCAL
X DMPADM
014 C00099 00012 DMBETW DMBET2 DMTAB DMSPA9 DMSPA8 DMTABC
015 C00102 00013 DMSPAC DMSPA4 DMSPA2 DMSPA3
016 C00104 00014 DMLEMV DMLEM2 DMLEM3 DMLEM4
017 C00106 00015 DMLEFX
018 C00110 00016 DMLEDE DMPROT DMBLNK DMCANC DMID DMUP DMFOR3 DMEEOL DMLED1 DMLED2
019 C00114 00017 DMCR3 DMLF2 DMLF3 DMCR4 DMCR DMLF DMLF1
020 C00116 00018 DMCURS DMCUR2 DMXR2 DMOUT2 DMXL1 DMXR1 DMCUR4 DMYU2 DMYD1 DMYU1 DMCUR5 DPCBEG DM25CU HP2
6CU DPCEND TELECU DMCUR3 DMOUT1 DMPREP DMPRE1 DMPR1A DMPRE2 DMPR2A DMPRE3 DMPRE4 DMPRE6 DMPR6A DMPRE7 DM
PRE8
021 C00128 ENDMK
022 C⊗;
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 2␈↓'α
001 ;RECDM RECDM0 RECDM8 RECDM5 RECDM3 RECDM9 RECDM4 RECDM6 RECDM2 RECDM7
002
003 ;PREPROCESSING ROUTINE FOR DMs TO MAKE THEIR INPUT CHARS LOOK LIKE DD/III CHARS
004 ;Direct return taken if char is just "ESC" or "ADD META" (no more handling).
005 ;Skip return taken if not DM or preprocessing not needed (eg, PTWR1W or image mode).
006 ; Note that if we came from RECINT, then the 10400 bits cannot be on!
007 ;Double skips on DM after doing the preprocessing (now char looks like on DD/III).
008 RECDM: MOVE TAC,LINTAB(LINE)
009 TRNN CHR,10400 ;Char in DD/III form (esc or meta char)?
010 TLNN TAC,DMLIN ;No, is this a Datamedia display?
011 JRST CPOPJ1 ;Not DM or doesn't need preprocessing
012 IFN FTNOED,<
013 SKIPLE MACROC ;Are we expanding a character macro?
014 JRST CPOPJ1 ;Yes, no preprocessing needed.
015 >;IFN FTNOED
016 SKIPN DDB,TTYTAB(LINE) ;Skip preprocessing if image mode
017 002 024 JRST RECDM0 ;No DDB, can't be image mode
018 MOVE IOS,DEVIOS(DDB) ;Check for image mode
019 TRNE IOS,10
020 TRNE IOS,6 ;Image mode 10 or 11?
021 002 024 JRST RECDM0 ;No, do preprocessing
022 JRST CPOPJ1 ;Yes, don't do DM preprocessing
023
024 RECDM0:
025 IFN FTNOED,<
026 SKIPE AC1,LETAB(LINE) ;Get DPY header
027 SKIPL AC2,NOEDIT(AC1) ;Skip if no-edit-key DM
028 JRST .+2 ;No.
029 003 005 JRST RECNED ;Yes.
030 >;IFN FTNOED
031 SETZB AC1,AC2 ;Used by DMESC and below
032 JUMPE CHR,DMESC ;NULL is the DM display ESCAPE char
033 CAIN CHR,200
034 JRST DMMETA ;EDIT-NULL is the "add META" character
035 AOS (P) ;Take double skip return now
036 LDB UCHN,[POINT 1,CHR,28] ;Get EDIT bit
037 ANDI CHR,177 ;Flush EDIT bit and any other garbage
038 CAIGE CHR,40 ;Special char?
039 005 024 MOVE AC1,DMTABL(CHR) ;Yes, get DM bits for this char
040 TRNN TAC,REGESC!SPCESC ;Is char being quoted or getting META added?
041 002 052 JRST RECDM5 ;No
042 TRNN TAC,REGESC
043 002 048 JRST RECDM8 ;Add META
044 005 012 TLNE AC1,INQUOT ;Can we quote this char?
045 DPB AC2,[ESCFLD+LINE,,LINTAB] ;Yes, clear quote (ESC) flag
046 002 085 JRST RECDM2 ;No, must be ESC char
047
048 RECDM8: IORI UCHN,2 ;Give him META
049 DPB AC2,[ESCFLD+LINE,,LINTAB] ;Clear "add META" flag
050 005 012 TLNE AC1,INQUOT ;Does META quote this char?
051 002 085 JRST RECDM2 ;Yes
052 RECDM5: TLNE TAC,PTYLIN ;If this is a non-ARPA PTY, then no
053 TLNE TAC,IMPBIT ; ASCII to Stanford conversion needed
054 002 057 JRST RECDM3 ;Not PTY or is ARPA PTY, do conversion
055 005 012 TLNN AC1,INQUOT ;Non-arpa PTY needs special action only
056 002 085 JRST RECDM2 ; on quotable chars (CLEAR, HOLD, CALL)
057 RECDM3: CAIN CHR,176
058 JRST [ MOVEI CHR,32
059 002 085 JRST RECDM2] ;176→32 (tilde)
060 CAIN CHR,175
061 002 085 AOJA CHR,RECDM2 ;175→176 (right brace)
062 005 013 TLNN AC1,DMCONV ;Need to convert this character?
063 002 085 JRST RECDM2 ;No
064 LDB CHR,[POINT 9,AC1,17] ;Get new character
065 TRNE CHR,600
066 002 086 JRST RECDM7 ;Already has bits--preserve 'em (CALL)
067 002 085 JUMPN CHR,RECDM2 ;Now put in CONTROL bit, if typed
068 005 024 CAME AC1,DMTABL+HOLDER ;Is this the hold/unhold character
069 002 082 JRST RECDM6 ;No, must be clear character
070 002 078 JUMPN UCHN,RECDM4 ;EDIT-HOLD is currently a no-op (reserved)
071 MOVEI CHR,10044 ;CONTROL-CLEAR for assumed unhold
072 SKIPE AC1,LETAB(LINE)
073 SKIPL DPHOLD(AC1) ;Are we holding?
074 RECDM9: MOVEI CHR,10041 ;No, use CONTROL-BREAK for hold
075 MOVEI UCHN,1
076 002 086 JRST RECDM7
077
078 RECDM4: SOS (P) ;Undo the AOS we already did
079 POPJ P, ;So direct return for no-op char
080
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 2.1␈↓'α
081 ;Here with CLEAR. If it was EDIT-CLEAR, it becomes META-CLEAR to flush DM queues.
082 RECDM6: JUMPE UCHN,.+2
083 MOVEI UCHN,2 ;EDIT-CLEAR becomes META-CLEAR
084 SKIPA CHR,[10044] ;Clear--leave EDIT bit as is
085 RECDM2: DPB UCHN,[POINT 2,CHR,28] ;Put control bits into character
086 RECDM7: LDB DSER,[POINT 7,CHR,35]
087 CAIL DSER,"A"
088 CAILE DSER,"Z"
089 JRST CPOPJ1
090 TRO DSER,40 ;Make lower case
091 JRST CPOPJ1
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 3␈↓'α
001 ;RECNED RECNER RECNNE RECNSP RECQNC RECQSP RECQVC RECNNQ RECNEC RECNE2 RECNEQ RECNEA RECNEZ RECNEN RECNE
;E RECNES NECLR NEFLSH NEHOLD NEHOL1 NEUNH NEC600 RECNEM RECNM1 RECNM2 RECNM3 MACMAX CHRMAC CHRMA1 CHRMA
;2 CHRMA3 CHRMA6 CHRMA7 CHRMA0 CHRMA4 CHRMA5 CHRMA8 CHRMA9 GETMAC GETMA1 DMMODE DMMODN DMMOD0 DMMOD1 DMQ
;ESC DMQES2 NOEDFL NEHTFL NEALLQ NEQMOD NEMMOD NECMOD NENUMB NEQUOT NEMETA NECTRL NETBPT NEBBPT NESBPT N
;EMBPT NECNUM NECQUO NECDSP NECCNV NECSUP NECVEC VECTNM NECHAR NECVBP CHRMAC GETMAC
002
003 IFN FTNOED,<
004 ;Get here with DPY HDR pointer in AC1, NOEDIT word in AC2
005 RECNED: ANDI CHR,177 ;No EDIT key, so flush parity bit.
006 MOVEI AC3,0 ;For clearing out bits later.
007 003 407 MOVE UCHN,NECHAR(CHR) ;Get dispatch word for this char.
008 003 362 TLNE AC2,NEQUOT ;Are we supposed to quote next char?
009 003 065 JRST RECNEQ ;Yes.
010 003 361 TLNE AC2,NENUMB ;Are we in a numeric arg?
011 003 081 JRST RECNEN ;Yes.
012 003 357 RECNER: TLNN AC2,NEQMOD ;Are we in a quoting mode?
013 003 047 JRST RECNNQ ;No.
014 CAIGE CHR,40 ;Yes, is this character special?
015 003 022 JRST RECNSP ;Secial char is complicated.
016 TRNE TAC,REGESC ;Is ESC pending?
017 TDZA AC2,AC2 ;Yes, no bucky bits
018 003 369 RECNNE: LDB AC2,NEMBPT ;No, get bucky mode
019 003 367 DPB AC2,NEBBPT ;Set to quote this char according to mode
020 003 065 JRST RECNEQ ;Now just like once-only quoting.
021
022 003 356 RECNSP: TLNE AC2,NEALLQ ;ALL-QUOTE mode?
023 003 389 TLZ UCHN,NECSUP ;Yes, no super characters.
024 003 389 TLNE UCHN,NECSUP ;Quote mode and some kind of special char.
025 003 035 JRST RECQSP ;Super char (CALL, HOLD, but not ESC)
026 003 391 TLNE UCHN,NECVEC
027 003 041 JRST RECQVC ;Vectorable char, might be ESC
028 RECQNC: TRZN TAC,REGESC ;Normal special (lined) character. ESC on?
029 003 018 JRST RECNNE ;No, just like normal char in quote mode.
030 MOVEI AC2,REGESC ;Yes, turn off ESC flag for TTYSER
031 TRNN TAC,SPCESC ; unless we are controlifying end of ESC [ cmd.
032 ANDCAM AC2,LINTAB(LINE)
033 003 047 JRST RECNNQ ;Treat as if not quoting mode.
034
035 RECQSP: TRNN TAC,REGESC ;Super char, ESC bit has opposite sense
036 003 052 JRST RECNEC ;Just CALL does a CALL.
037 MOVEI AC2,REGESC ;Turn off ESC flag for TTYSER
038 ANDCAM AC2,LINTAB(LINE)
039 003 018 JRST RECNNE ;ESC CALL (etc) does buckied beta (etc)
040
041 003 459 RECQVC: LDB AC2,NECVBP ;Vectorable char, get its vector index.
042 ADDI AC2,(AC1) ;Index into dpy hdr
043 SKIPL NEVECT-1(AC2) ;Is this an ESCAPE code?
044 003 028 JRST RECQNC ;No, just like any other control code
045 JRST DMESC ;Yes, it means ESCAPE by golly.
046
047 003 459 RECNNQ: LDB AC2,NECVBP ;Get variable-char dispatch
048 003 052 JUMPE AC2,RECNEC ;Zero means constant char.
049 ADDI AC2,(AC1) ;Make pointer into dpy hdr.
050 SKIPE AC2,NEVECT-1(AC2) ;Skip unless this tty has a macro for this char.
051 003 115 JRST RECNEM ;Process the macro.
052 003 378 RECNEC: TLNE UCHN,NECQUO ;Is this a quoting character?
053 003 089 JRST RECNES ;Yes, set bucky bits.
054 003 380 TLNE UCHN,NECDSP ;Is this a special dispatch char?
055 JRST (UCHN) ;Yes, do whatever's right.
056 TLNE TAC,PTYLIN ;If this is a non-ARPA PTY, then no
057 TLNE TAC,IMPBIT ; ASCII to Stanford conversion needed
058 JRST .+2 ;Not PTY or is ARPA PTY, do conversion
059 003 382 TLNN UCHN,NECCNV ;Local PTY, skip if table does ASCII/SAIL.
060 MOVEI CHR,(UCHN) ;Otherwise it's a nine-bit SAIL character.
061 LDB UCHN,[POINT 2,CHR,28]
062 RECNE2: AOS (P) ;This is a real character.
063 002 085 JRST RECDM2 ;Set up ACs for TTYSER and leave.
064
065 003 078 RECNEQ: JUMPE CHR,RECNEZ ;Can't quote null.
066 TLNE TAC,PTYLIN ;If this is a non-ARPA PTY, then no
067 TLNE TAC,IMPBIT ; ASCII to Stanford conversion needed
068 JRST .+2 ;Not PTY or is ARPA PTY, do conversion
069 003 074 JRST RECNEA ;No conversion for local PTY.
070 CAIN CHR,32 ;↑Z has αTAB in its table entry
071 003 074 AOJA CHR,RECNEA ; but means not-equal when quoted
072 003 382 TLNE UCHN,NECCNV ;Does this char require ASCII/SAIL conversion?
073 MOVEI CHR,(UCHN) ;Yes, get the converted version.
074 003 367 RECNEA: LDB UCHN,NEBBPT ;Get saved bucky bits.
075 003 368 DPB AC3,NESBPT ;Clear out state flags.
076 003 062 JRST RECNE2
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 3.1␈↓'α
077
078 003 368 RECNEZ: DPB AC3,NESBPT ;Trying to quote null, just flush quote mode
079 POPJ P, ; and flush this character.
080
081 003 376 RECNEN: TLNN UCHN,NECNUM ;Is this char a digit or sign?
082 003 086 JRST RECNEE ;No, end of numeric arg
083 MOVEI UCHN,1 ;Yes, controlify it
084 003 062 JRST RECNE2
085
086 003 368 RECNEE: DPB AC3,NESBPT ;End of number. Clear out state flags.
087 003 012 JRST RECNER ;This is a regular char.
088
089 003 368 RECNES: DPB UCHN,NESBPT ;Quoting char, save state flags.
090 POPJ P, ;No further processing of this char.
091
092 NECLR: TDZA UCHN,UCHN ;Simulate CLEAR
093 NEFLSH: MOVEI UCHN,1 ;Simulate EDIT-CLEAR
094 AOS (P)
095 002 082 JRST RECDM6 ;Join edit-key code
096
097 NEHOLD: MOVEI AC2,REGESC ;Hold. Get rid of ESC bit for uplevel.
098 ANDCAM AC2,LINTAB(LINE)
099 TRZE TAC,REGESC ;Is it ESC HOLD?
100 003 106 JRST NEUNH ;Yes, unhold.
101 MOVE AC2,NOEDIT(AC1) ;No. Get back flag word.
102 003 354 TLNN AC2,NEHTFL ;TTY HTOGGLE set?
103 003 105 JRST NEHOL1 ;No. Hold.
104 SKIPL DPHOLD(AC1) ;Are we holding?
105 NEHOL1: SKIPA CHR,[10041] ;No, use CONTROL-BREAK for hold
106 NEUNH: MOVEI CHR,10044 ;CONTROL-CLEAR for unhold
107 MOVEI UCHN,1
108 AOS (P)
109 002 086 JRST RECDM7
110
111 NEC600: SETZB UCHN,DSER ;CALL: no bucky bits
112 MOVEI CHR,600 ; (as opposed to 3)
113 JRST CPOPJ2 ; despite 600 bits on in CHR.
114
115 RECNEM: JUMPL AC2,DMESC ;If it's an ESCAPE macro, just do ESCAPE
116 TLNN AC2,-1 ;Make sure there is a nonzero length
117 POPJ P, ;Else it's a null macro (can't happen)
118 HLRZM AC2,MACROC ;Save character count
119 HRLI AC2,441400 ;Make 12.-bit BPT to character string
120 MOVEM AC2,MACROP ;Save in core.
121 RECNM1: ILDB CHR,MACROP ;Macro loop. Get a char
122 TRZE CHR,2000
123 003 138 JRST RECNM3 ;Special quoting character
124 TRZE CHR,4000
125 TRO CHR,10000 ;Not enough room in byte to store this right.
126 LDB UCHN,[POINT 2,CHR,28]
127 TRNE CHR,10000 ;If some flavor of escape char,
128 TRZ CHR,600 ; bucky bits should be only in UCHN, not in CHR.
129 PUSH P,AC1 ;Save our dpy hdr pointer
130 PUSH P,LINE ;Save our line number
131 PUSHJ P,RECINC ;Deal with it.
132 POP P,LINE
133 POP P,AC1
134 RECNM2: SOSLE MACROC ;Count down
135 003 121 JRST RECNM1
136 POPJ P, ;Done with macro
137
138 003 362 RECNM3: TRO CHR,NEQUOT ;Special quoting code:
139 003 368 DPB CHR,NESBPT ;Save state
140 003 134 JRST RECNM2
141
142 ;; UUO to set up a macro definition for a character.
143 ;; call:
144 ;; MOVEI AC,ADDR
145 ;; CHRMAC AC,
146 ;; <error return -- code in AC>
147 ;; <success return>
148 ;;
149 ;;ADDR: CHAR,,LENGTH
150 ;; BYTE (12)XX,XX,XX
151 ;; ETC
152 ;;
153 ;; CHAR is the character which is to be redefined. It must be a 7-bit
154 ;; character, and must be one of the redefinable ones.
155 ;; LENGTH is the number of 12.-bit bytes in the macro definition.
156 ;; If LENGTH is zero then any previous macro will be flushed and
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 3.2␈↓'α
157 ;; the character will have its default meaning.
158 ;; The bytes are standard 9-bit SAIL characters, with the following
159 ;; special codes allowed:
160 ;; 0600 CALL
161 ;; 2000 quote following char (↑Q)
162 ;; 2001 quote with CONTROL (↑P)
163 ;; 2002 quote with META (↑V)
164 ;; 2003 quote with CONTROL-META (↑W)
165 ;; 4041 BREAK
166 ;; 4042 ESCAPE
167 ;; 4044 CLEAR
168 ;; 4241 HOLD
169 ;; 4244 UNHOLD
170 ;; 4444 FLUSH DM QUEUES
171 ;; If the UUO takes the direct return, the AC will contain one of these codes:
172 ;; 0 UUO not defined (FTNOED off) or system error
173 ;; 1 Job's TTY not a NOEDIT display
174 ;; 2 CHAR not a redefinable character
175 ;; 3 Trying to redefine the only ESCAPE character
176 ;; 4 LENGTH is greater than maximum allowed
177 ;; 5 Some byte isn't an allowable SAIL character
178
179 MACMAX←←20 ;Pretty small because we stay in CH5 during the execution.
180
181 ↑CHRMAC:PUSHJ P,TTYFNU ;Set up LINE etc.
182 MOVEI TAC,1 ;Error code for not a NOEDIT dpy
183 JUMPE LINE,STOTAC ;Detached job
184 SKIPE AC2,LETAB(LINE)
185 SKIPL NOEDIT(AC2)
186 JRST STOTAC ;Not a NOEDIT dpy
187 XCTR XR,[MOVE DSER,(UUO)];Get user's AC
188 XCTR XR,[MOVE DDB,(DSER)];Get first word of arg block
189 HLRZ CHR,DDB ;Get char s/he wants to modify
190 MOVEI TAC,2 ;Error code for char not vectorable
191 CAILE CHR,177
192 JRST STOTAC ;Char out of range
193 003 459 LDB CHR,NECVBP ;Get vector index
194 SOJL CHR,STOTAC ;Not vectorable
195 JUMPN CHR,.+2 ;Skip unless NUL
196 HRLI CHR,400000 ;Flag NUL in case restoring default ESC
197 ADDI CHR,NEVECT(AC2) ;Point to vector word
198 SKIPL AC1,(CHR) ;Is this char an ESCAPE char?
199 003 208 JRST CHRMA2 ;No, OK to modify.
200 003 405 HRLI AC2,-VECTNM ;Yes, make sure there is another ESCAPE too.
201 CHRMA1: CAIE CHR,NEVECT(AC2) ;Is this the word we're changing?
202 SKIPL NEVECT(AC2) ;No, is it an ESCAPE?
203 003 201 AOBJN AC2,CHRMA1 ;Our word, or not ESCAPE
204 003 208 JUMPL AC2,CHRMA2 ;There is another ESCAPE, so this is OK.
205 MOVEI TAC,3 ;Error code for eliminating last ESCAPE
206 JRST STOTAC
207
208 CHRMA2: MOVEI TAC,(DDB) ;Length of macro string
209 003 179 CAILE TAC,MACMAX ;Must be within maximum length
210 003 258 JRST CHRMA8 ;Nope.
211 003 261 JUMPE TAC,CHRMA9 ;User is undefining a macro.
212 MOVEI AC2,1(DSER) ;Set up BPT to user string
213 HRLI AC2,441400 ;12.-bit bytes
214 CHRMA3: XCTR XLB,[ILDB TAC1,AC2];Get a user byte
215 CAIL TAC1,2000
216 CAILE TAC1,2003
217 003 240 JRST CHRMA0 ;Not a special quoting code
218 003 214 CHRMA6: SOJG TAC,CHRMA3 ;Check next char
219 HRRZ AC1,(CHR) ;OK. Get previous macro block if any.
220 JUMPE AC1,.+2 ;No previous macro
221 PUSHJ P,FSGIVE ;Flush it.
222 MOVEI TAC,2(DDB) ;OK, get length
223 IDIVI TAC,3 ; in words
224 MOVEI AC3,(TAC) ;Must be here for FSGET
225 PUSHJ P,FSGET ;Get some FS
226 JRST RTZERO ;Can't happen at UUO level
227 MOVEI TAC1,(AC1) ;Here is the returned block
228 HRLI TAC1,1(DSER) ;TAC1 is the BLT AC
229 ADDI TAC,-1(AC1) ;TAC has the last word to BLT into
230 XCTR XBLTR,[BLT TAC1,(TAC)]
231 HRLI AC1,(DDB) ;Get char length in LH of pointer
232 MOVEI TAC,(DDB) ;Length
233 003 237 SOJN TAC,CHRMA7 ;Jump if not of length 1
234 XCTR XLB,[LDB TAC,[POINT 12,1(DSER),11]] ;Get first (only) char
235 CAIN TAC,4042 ;Is it ESCAPE?
236 TLO AC1,400000 ;Yes, flag it.
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 3.3␈↓'α
237 CHRMA7: MOVEM AC1,(CHR) ;Establish the macro.
238 JRST CPOPJ1 ;Success.
239
240 CHRMA0: TRNE TAC1,3000
241 003 250 JRST CHRMA4 ;These bits are undefined
242 TRNN TAC1,4000
243 003 253 JRST CHRMA5 ;Not an escape char
244 ANDI TAC1,177 ;Escape char, only a few are allowed
245 CAIE TAC1,41 ;BREAK
246 CAIN TAC1,42 ;ESCAPE
247 003 218 JRST CHRMA6 ;ok
248 CAIN TAC1,44 ;CLEAR
249 003 218 JRST CHRMA6
250 CHRMA4: MOVEI TAC,5 ;Error code for bad char
251 JRST STOTAC
252
253 CHRMA5: TRNN TAC1,177 ;Is this a null?
254 CAIN TAC1,600 ;Yes, must be a CALL
255 003 218 JRST CHRMA6 ;ok
256 003 250 JRST CHRMA4 ;not ok
257
258 CHRMA8: MOVEI TAC,4 ;Error code for bad length
259 JRST STOTAC
260
261 CHRMA9: HLLZM CHR,(CHR) ;Flush old macro, maybe restoring NUL as ESC
262 JRST CPOPJ1
263
264 ;; UUO to read a character macro.
265 ;;
266 ;;call: MOVEI AC,ADDR
267 ;; GETMAC AC,
268 ;; <error return -- not a NOEDIT DM>
269 ;; <success return -- ADDR is set up as CHRMAC arg block>
270 ;;
271 ;;ADDR: CHR,,0
272 ;; BLOCK 6
273
274 ↑GETMAC:PUSHJ P,TTYFNU ;Set up LINE etc.
275 JUMPE LINE,CPOPJ ;Detached job
276 SKIPE AC2,LETAB(LINE)
277 SKIPL NOEDIT(AC2)
278 POPJ P, ;Not a NOEDIT dpy
279 AOS (P) ;Take success return
280 XCTR XR,[MOVE DSER,(UUO)];Get user's AC
281 XCTR XR,[HLRZ CHR,(DSER)];Get user's char
282 003 459 LDB AC1,NECVBP ;Get its vector word
283 003 287 JUMPE AC1,GETMA1 ;Not vectorable
284 ADDI AC2,-1(AC1) ;Find vector word
285 MOVE AC1,NEVECT(AC2)
286 TLZ AC1,400000 ;Flush escape flag
287 GETMA1: XCTR XW,[HLRM AC1,(DSER)];Tell user the length
288 JUMPE AC1,CPOPJ ;Done if no macro
289 HLRZ TAC,AC1 ;Length in TAC
290 ADDI TAC,2 ;Make it words
291 IDIVI TAC,3
292 HRLZI AC2,(AC1) ;BLT org is FS block
293 HRRI AC2,1(DSER) ;BLT dest is user block
294 ADDI TAC,(DSER) ;BLT end is start plus length
295 XCTR XBLTW,[BLT AC2,(TAC)]
296 POPJ P,
297
298 ;; Here from DOESC for ESC/BRK n '
299
300 DMMODE: HLL LINE,LINTAB(LINE) ;Get good bits
301 TLNE LINE,DMLIN ;Must be a DM
302 SKIPN AC2,LETAB(LINE) ; with a dpy hdr (drd)
303 POPJ P,
304 SKIPE GOTARG
305 003 311 JRST DMMODN ;Jump for BRK '
306 CAILE AC1,3 ;Arg must be 3 or less
307 CAIN AC1,ESCNUL ; or none at all
308 003 322 JRST DMMOD0
309 JRST DMBONG ;Beep bad argument
310
311 DMMODN: CAMN AC1,[-ESCNUL]
312 003 322 JRST DMMOD0 ;Plain BRK ' is EDIT mode
313 MOVMS AC1 ;Else it's ALL-QUOTE mode
314 MOVE AC3,NOEDIT(AC2)
315 003 356 TLNE AC3,NEALLQ ;If already in an ALL-QUOTE mode,
316 CAILE AC1,3 ; OK to switch to another with easy arg
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 3.4␈↓'α
317 SUBI AC1,=100 ;Arg must be 100 to 103 (hard to type)
318 JUMPL AC1,DMBONG ;Too small.
319 CAILE AC1,3
320 JRST DMBONG ;Too big.
321 IORI AC1,10 ;Add ALL-QUOTE bit and fall through
322 DMMOD0: PUSH P,AC1
323 PUSH P,AC2
324 003 327 PUSH P,[DMMOD1] ;Set up call to TTY NOEDIT code
325 HLLM AC1,(P) ;BREAK ' clears NOEDIT
326 JRST NOEDCM ;POPJs back
327 DMMOD1: JFCL ;skip return possible
328 POP P,AC1 ;Get back dpy hdr in AC1
329 POP P,AC2 ;Get back arg in AC2
330 JUMPL AC2,CPOPJ ;Done if entering EDIT mode
331 CAIN AC2,ESCNUL ;Skip if entering quote mode
332 TDZA TAC,TAC ;Normal noedit mode
333 MOVEI TAC,4(AC2) ;TAC has quote-mode bit plus buckies
334 003 369 DPB TAC,NEMBPT ;Set quoting mode in NOEDIT word
335 POPJ P,
336
337 ;; Here from DOESC1 for ESC " command, sets both REGESC and ↑Q flags
338
339 DMQESC: SKIPE AC1,LETAB(LINE) ;Must be a dpy
340 SKIPL NOEDIT(AC1) ; in NOEDIT mode
341 003 346 JRST DMQES2 ;Ignore cmd
342 003 362 MOVEI TAC,NEQUOT
343 003 368 DPB TAC,NESBPT ;Set ↑Q quote without bucky for next char
344 POPJ P, ;Turn ESC flag (back) on
345
346 DMQES2: HRROI AC3,1⊗PUNITS-1 ;BH 3/13/75 BUG FIX FOR PTYUUO TO MAPPED TTY
347 ANDM AC3,LINTAB(LINE) ;CLEAR THE ESCAPE BITS AND ARG
348 POPJ P,
349
350 ;Format of NOEDIT entry in DPYHDR
351
352 ;LH flag bits
353 NOEDFL←←400000 ;On if TTY NOEDIT. Must be sign bit.
354 NEHTFL←←200000 ;On if TTY HTOGGL.
355 ;The next four bits must be together.
356 NEALLQ←←200 ;On if ALL-QUOTE mode.
357 NEQMOD←←100 ;On if any quoting mode in effect
358 NEMMOD←←40 ;Meta quoting mode
359 NECMOD←←20 ;Control quoting mode
360 ;The next four bits must be together.
361 NENUMB←←10 ;On if ↑N numeric arg mode.
362 NEQUOT←←4 ;On if next char should be quoted.
363 NEMETA←←2 ;Meta bit for next (quoted) char
364 NECTRL←←1 ;Control bit for next (quoted) char
365
366 NETBPT: POINT 1,NOEDIT(AC1),1 ;BPT to HTOGGL bit
367 NEBBPT: POINT 2,NOEDIT(AC1),17 ;BPT to bucky bits only
368 NESBPT: POINT 4,NOEDIT(AC1),17 ;BPT to quoting state flags
369 NEMBPT: POINT 4,NOEDIT(AC1),13 ;BPT to noedit quoting mode
370
371
372 ;NECHAR conversion table for no-edit-key display input.
373 ;128. words, one per 7-bit typable character.
374 ;LH is flag bits, RH is a dispatch of some sort depending on the bits.
375
376 NECNUM←←400000 ;Char is a digit or sign (for ↑N)
377 ; RH is the char itself
378 NECQUO←←200000 ;Char is a quoter for following char
379 ; RH is the state bits for NESBPT deposit
380 NECDSP←←100000 ;Char requires special processing
381 ; RH is the routine to JRST to
382 NECCNV←←40000 ;Char requires ASCII-to-SAIL conversion
383 ; RH is the converted char
384
385 ;If none of the above flags are set, RH is a (9-bit) char which
386 ;is used in place of the input (7-bit) char. The new char will
387 ;be the same as the old except for the below-40 control codes.
388
389 NECSUP←←20000 ;Char is "super" in quote mode (CALL, HOLD)
390
391 NECVEC←←77 ;If this LH field is nonzero, the char
392 ;is "variable" and the field is an index
393 ;into an index of macro definitions
394 ;for user-definable multi-char sequences.
395 ;If the number of characters with NECVEC set changes, the length of the
396 ;NEVECT block in DPYHDR (in CACDAT) must be chaged too.
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 3.5␈↓'α
397 ;
398 ;The macro definitions are in a block starting at NEVECT in the dpy hdr.
399 ;Each entry is zero if there is no macro defined, or <length>,,<addr>
400 ;where addr is the address of a free storage block containing 12.-bit
401 ;bytes, and <length> is the number of such bytes. Notwithstanding the
402 ;preceding sentence, the sign bit of the vector word is on iff the
403 ;macro char is an ESCAPE char. (This can be either by macro or by default.)
404
405 VECTNM←←13 ;NUMBER OF VECTOR WORDS (FOR TTYSUB)
406
407 003 380 NECHAR: NECDSP!1,,DMESC ;000 ↑@ ESCAPE
408 214 ;001 ↑A αFF
409 200+"B" ;002 ↑B αB
410 003 111 NECSUP!NECDSP,,NEC600 ;003 ↑C CALL
411 200+"D" ;004 ↑D αD
412 200+"I" ;005 ↑E αI
413 240 ;006 ↑F αSP
414 003 097 NECSUP!NECDSP,,NEHOLD ;007 ↑G HOLD
415 2,,377 ;010 ↑H αBS
416 3,,11 ;011 ↑I TAB
417 4,,12 ;012 ↑J LF
418 5,,13 ;013 ↑K VT
419 6,,14 ;014 ↑L FF
420 15 ;015 ↑M CR
421 003 361 NECQUO,,NENUMB ;016 ↑N Numeric arg
422 215 ;017 ↑O αCR
423 003 364 NECQUO,,NEQUOT!NECTRL ;020 ↑P Quote with α
424 003 362 NECQUO,,NEQUOT ;021 ↑Q Quote without bucky
425 200+"R" ;022 ↑R αR
426 200+"S" ;023 ↑S αS
427 200+"T" ;024 ↑T αT
428 003 092 NECDSP,,NECLR ;025 ↑U CLEAR
429 003 363 NECQUO,,NEQUOT!NEMETA ;026 ↑V Quote with β
430 003 363 NECQUO,,NEQUOT!NECTRL!NEMETA
431 ;027 ↑W Quote with αβ
432 200+"K" ;030 ↑X αK
433 200+"L" ;031 ↑Y αL
434 211 ;032 ↑Z αTAB
435 003 382 NECCNV!7,,175 ;033 ↑[ ALT
436 003 093 NECDSP!10,,NEFLSH ;034 ↑\ Flush output queues
437 003 380 NECDSP!11,,DMBONG ;035 ↑] Undefined
438 003 380 NECDSP!12,,DMBONG ;036 ↑↑ Undefined
439 003 380 NECDSP!13,,DMBONG ;037 ↑← Undefined
440 REPEAT 52-37,<
441 003 407 .-NECHAR ;040-052 Punctuation, unmodified
442 >
443 003 376 NECNUM,,"+" ;053 + Controllified by ↑N
444 "," ;054 ,
445 003 376 NECNUM,,"-" ;055 - Controllified by ↑N
446 REPEAT 57-55,<
447 003 407 .-NECHAR ;056-057 Punctuation, unmodified
448 >
449 REPEAT 71-57,<
450 003 407 NECNUM,,.-NECHAR ;060-071 Digits, controllified by ↑N
451 >
452 REPEAT 174-71,<
453 003 407 .-NECHAR ;072-174 Unmodified ASCII chars
454 >
455 003 382 NECCNV,,176 ;175 Close brace converted ASCII/SAIL
456 003 382 NECCNV,,32 ;176 Tilde converted ASCII/SAIL
457 577 ;177 Rubout αBS
458
459 003 407 NECVBP: POINT 6,NECHAR(CHR),17 ;BPT to variable char vector index
460
461 >;IFN FTNOED
462 IFE FTNOED,<
463 ↑CHRMAC:JRST RTZERO ;No such UUO if no FTNOED
464 ↑GETMAC:POPJ P,
465 >;IFE FTNOED
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 4␈↓'α
001 ;TBSSET RAPPED NOINTR DMBPND LEWAIT DMSTAY DMXCAL DMQUOT TRUNCA NOEEOL NOEEOB BETWEE USERGO CHASTE PROTL
;E DMATXY DMXLE QUO177 DMUXFR BLNKON PROTON IDON DMUMSK CTRLCH DMTAPE
002
003 ;DATAMEDIA INTERRUPT LEVEL (CH5) CODE: COMMENTS AND DEFS
004
005 ;FIGURES OUT WHAT TEXT TO SEND OUT TO THE DM NEXT.
006 ;UNQUOTED TTY CONTROL CHARS (BELOW 40) ARE SENT AS BLINKING LETTERS,
007 ;ALTHOUGH THE HARDWARE MAY BE MODIFIED TO DISPLAY "BLINKING" CHARS AS BOLD
008 ;AND VICE VERSA. "BLINKING" HERE MEANS WHAT DATAMEDIA CORP. THINKS CAUSES BLINKING.
009
010 ; FLAGS in DAT:
011
012 ;DM STATE FLAGS
013 ;(RH of DAT, RH of DMFLAG(J))
014
015 ↑TBSSET←←40000 ;Tabs have been set
016 ↑RAPPED←←20000 ;Temporary flag: just passed last screen col, or need to skip LF
017 ↑BELOW ←←10000 ;This xfer is off screen or over line editor--suppress its output.
018 ↑NOINTR←←1000 ;Don't output anything but user program queue
019 ↑DMBPND←←100 ;There is a beep pending (or running) on this DM
020 ↑LEWAIT←←40 ;Only user program output is permitted while this bit is on
021 ;;modes←←17 ;See 4 mode flags below.
022 ↑DMSTAY←←0 ;Bits that don't get reset by ESC C and friends
023
024 ;QUEUE ENTRY FLAGS
025 ;(LH of DAT and RH of QFLAGS(TAC); LH of DMLEFL(J) for line editor xfers.)
026
027 ↑DMXCAL←←200000 ;Call routine in LH of QFREE(TAC) when xfer done
028 ↑DMQUOT←←100000 ;Don't interpret any text
029 ↑TRUNCA←←40000 ;Ignore text beyond last col on display
030 ↑NOEEOL←←20000 ;Suppress erasing each old line before output on it
031 ↑NOEEOB←←10000 ;Suppress erasing of lines on which nothing is output but CRLF
032 ↑BETWEE←←4000 ;Ignore spaces between tabs and ending tab
033 ↑USERGO←←2000 ;Don't interrupt user program in progress
034 ↑CHASTE←←1000 ;No output (nor EEOL) done yet on current line
035 ↑PROTLE←←400 ;Don't overwrite the line editor's text (user program only)
036 ↑DMATXY←←200 ;Get and store X-Y position @QXYLOC
037 ↑DMXLE←←100 ;Line editor xfer--store final XY position at DMLEXY(J)
038 ↑QUO177←←40 ;Don't interpret 177's as quoting anything, just send them
039 ↑DMUXFR←←20 ;This is a user program transfer
040 ;;modes←←17 ;See 4 mode flags below.
041 ;;Note that the CHASTE bit on in a user program header block flag word means
042 ;; that any previously queued and unfinished user program should be flushed
043 ;; immediately. This flushes only those entries in the user program queue that
044 ;; have a QXYLOC LH equal to <job number> in addition to having the DMXCAL
045 ;; bit on. Thus a job can flush any of the programs which that particular
046 ;; job queued.
047 ;;Note also that the DMATXY bit on in a user program header block flag word
048 ;; means that when the user program finishes, any entries in the wholine
049 ;; queue for this DM should be flushed (to establish cursor stability briefly).
050 ;;Note also that the DMXLE bit on in a user program header block flag word
051 ;; means that user program output is given highest priority until the given
052 ;; user display program has finished. Thus the line editor and page printer
053 ;; cannot even start before the user program, much less interrupt it.
054
055 ;The next four flags are used in both halves of DAT
056 ;In LH, a one means Queue entry has set corresponding mode.
057 ;In RH, a one means the DM is actually in the corresponding mode.
058
059 ↑BLNKON←←10 ;Blink mode
060 ↑PROTON←←4 ;Protected field mode
061 ↑IDON←←2 ;Insert/Delete mode
062
063 ;This is the mask of user-settable flags
064 004 035 ↑DMUMSK←←DMQUOT!TRUNCA!NOEEOL!NOEEOB!BETWEE!USERGO!PROTLE
065
066 ;Special flag in RH of CHR indicating character is an arrow char (control char).
067 CTRLCH←←400000 ;Output this character as blinking
068 DMTAPE←←200000 ;Output this character preceded by ascii escape character
069
070 ;Normally, an EEOL is output before the first character on a line, but this
071 ;is inhibited if either DMQUOT or NOEEOL is on, or if NOEEOB is on and nothing
072 ;printable (what's that mean, you ask?) has been output (CHASTE is on).
073
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 5␈↓'α
001 ;DMTABL dispatch table for quoted DM control characters
002
003 ;Dispatch table for quoted control characters.
004 ;These routines keep track of the X-Y position and the mode flags,
005 ;and many of these routines do nothing but diddle these things without doing output.
006 ;Therefore, it is necessary that any way out of this code save the DAT flags in
007 ;QFLAGS(TAC) and DMFLAG(J).
008
009 ;400000 ;Means character need not be quoted on output to get special effect
010 IDSPCL←←200000 ;Special output char in I/D mode--doesn't change cursor position
011 XYSPCL←←100000 ;Special output char when seen just after FF (as X or Y position)
012 INQUOT←←40000 ;This character can be quoted on input by NULL or "add META".
013 DMCONV←←20000 ;This character normally gets converted to something else on input.
014 PDADDR←←10000 ;In ID mode, char is ADD ROW (for padding)
015 PDDELR←←4000 ;In ID mode, char is DEL ROW (for padding)
016 ;;convertedchr←←777 ;Bits in LH used to hold character we convert to on input.
017
018 ;MASTER is the CLEAR character which clears the line editor.
019 ;HOLDER is the HOLD character that holds PP output.
020 ;These two chars' entries must be unique in the table below.
021
022 DEFINE C(X) <↑X←←.-DMTABL>
023
024 009 029 DMTABL: DMXMT6 ;000 NL ;↑@ ;null--if it prints, put DMXMT5 here
025 009 029 C(PADCHR) DMXMT6 ;001 ↓ ;↑A ;no-op, used for padding
026 010 044 C(HOME) XYSPCL,,DMHOME ;002 α ;↑B ;home
027 009 029 DMCONV!INQUOT!600,,DMXMT6 ;003 β ;↑C ;no-op
028 014 004 C(LEMOVE) DMLEMV ;004 ∧ ;↑D ;no-op except for LE
029 016 004 C(LEDELE) DMLEDE ;005 ¬ ;↑E ;no-op except for LE
030 015 008 C(LEFIXT) DMLEFX ;006 ε ;↑F ;no-op except for LE
031 011 038 DMBELL ;007 π ;↑G ;bell
032 010 050 C(IDDELC) IDSPCL,,DMBACK ;010 ␈λ ;↑H ;back cursor (I/D: delete char)
033 012 015 400000,,DMTAB ;011 TB ;↑I ;tab
034 017 027 C(IDADDR) 400000!IDSPCL!PDADDR,,DMLF ;012 LF ;↑J ;lf (I/D: add row w/padding)
035 009 029 DMXMT6 ;013 VT ;↑K ;tab clear, not allowed
036 008 003 XYSPCL,,XYGET ;014 FF ;↑L ;set X-Y position
037 017 021 400000,,DMCR ;015 CR ;↑M ;cr
038 016 026 C(BLINK) DMBLNK ;016 ∞ ;↑N ;blink on
039 016 025 C(PROTEC) DMPROT ;017 ∂ ;↑O ;protected field on
040 016 032 C(ID) DMID ;020 ⊂ ;↑P ;I/D on
041 009 029 XYSPCL,,DMXMT6 ;021 ⊃ ;↑Q ;transmit page, currently flushed
042 009 029 XYSPCL,,DMXMT6 ;022 ∩ ;↑R ;transmit page to printer, currently flushed
043 009 029 DMXMT6 ;023 ∪ ;↑S ;transmit line, currently flushed
044 009 029 DMXMT6 ;024 ∀ ;↑T ;no-op
045 009 029 DMXMT6 ;025 ∃ ;↑U ;no-op
046 009 029 DMXMT6 ;026 ⊗ ;↑V ;no-op
047 016 046 C(EEOL) DMEEOL ;027 ↔ ;↑W ;erase to end of line
048 016 029 C(CANCEL) XYSPCL,,DMCANC ;030 _ ;↑X ;cancel (unlock)
049 009 029 DMXMT6 ;031 → ;↑Y ;set tab, not allowed
050 016 036 C(IDDELR) DMCONV!IDSPCL!PDDELR!33,,DMUP ;032 ~ ;↑Z ;up cursor (I/D: delete row)
051 009 029 DMCONV!175,,DMXMT6 ;033 ≠ ;↑[ ;no-op
052 010 066 C(IDADDC) IDSPCL,,DMFORW ;034 ≤ ;↑\ ;forward cursor (I/D: add char)
053 009 029 DMXMT6 ;035 ≥ ;↑] ;roll on, not allowed
054 010 034 C(MASTER) DMCONV!INQUOT!XYSPCL,,DMMAST ;036 ≡ ;↑↑ ;master clear--like home+erase+clears tabs
055 010 036 C(HOLDER) DMCONV!INQUOT!XYSPCL,,DMERAS ;037 ∨ ;↑← ;erase screen
056 013 004 400000,,DMSPAC ;040 SP ;space
057 ;Output escapes start at 41 and dispatch just like quoted control chars.
058 ;There are currently no output escapes defined.
059 005 022 C(OUTESC) ;Marks end of output escapes
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 6␈↓'α
001 ;PADID DM128 NO177 NOBOLD NODICU NBTSEQ DM2500 HP2648 TELERAY
002
003 ;DPYDES flags, DPYBTS flags, AC usage, dpy hdr usage.
004
005 ;Flag bits in Left half of DPYDES(LINE), carried here in LH of PROG.
006 ;These flags describe the terminal-type of the display.
007 PADID←← 1 ;Need padding for I/D operations, using DM 2500 algorithm
008 ↑DM128←← 2 ;DM has special esc sequence mod to allow 128 chars displayed
009 ↑NO177←← 4 ;DM doesn't print 177s
010 ↑NOBOLD←← 10 ;DM doesn't have BOLD and BLINK hardware interchanged.
011
012
013 ;Flag bits in Left half of DPYBTS(dpy hdr), carried here in LH of J.
014 NODICU←← 1 ;Cannot do arbitrary cursor positioning while in ID mode
015
016
017 ;AC usage, dpy header cell usage.
018
019 Comment ⊗ AC usage by DMXMT. J, DDB, LINE are preserved, IOS only set to DEVIOS.
020 IOS/ DEVIOS(DDB) ;used rarely
021 TAC/ pointer to FS block for queue entry being output
022 TAC1 (LINE)/ line characteristics and number
023 P/ PDL pointer
024 J/ DPYBTS(J),,LETAB(LINE) ;dpy-type bits,,dpy header address
025 DAT/ queue entry flags,,display state flags
026 DDB/ TTYTAB(LINE) ;TTY DDB address
027 PROG/ DPYDES(J) ;dpy-type flags,,dpy descriptor block address
028 TEM (CHR)/ character being output
029 DSER/ byte pointer into quicky buffer
030 UCHN/ (unused)
031 PID/ (unused)
032 UUO/ (unused)
033 AC1/ temporary
034 AC2/ temporary
035 AC3/ X,,Y cursor position
036 end of comment ⊗
037
038 ;DPY HEADER CELLS FOR "QUICK" OUTPUT:
039 ;DMQKCT count of bytes waiting for output
040 ;DMQKPT byte pointer to waiting quick bytes
041 ;DMQKBF buffer for quick output bytes, probably four words long
042 ; (must be able to hold: FF,X,Y,CANCEL,PROTECT,BLINK,ID,EEOL,8 SPACES)
043
044 ;OTHER DPY HEADER CELLS
045 ;UCOUNT
046 ; <job>,,<address of user run flag to SOS (or SETZM?) when user dpy program is done>
047 ; (used by clock level routine which actually SOSes the cell)
048 ; (UCOUNT cell must be cleared by RESET; perhaps RESET should actually flush
049 ; DM user dpy program and SOS the user cell before clearing UCOUNT.)
050 ;DMLEPT ;Header of queue of Line Editor xfers
051 ;DMSPPT ;Header of queue of SPecial xfers (holding message, setting tabs, DMEOSL)
052 ;DMPPPT ;Header of queue of Page Printer xfers
053 ;DMUSER ;Header of queue of USER display program xfers
054 ;DMWHO ;Header of queue of WHOline xfers
055 ;DMFLAG ;Flag word indicating current actual status of DM terminal
056 ;DMXY ;Actual X-Y position of DM cursor
057 ;DPYHGT ;Number of lines on display's screen (should be valid for any type of dpy)
058
059 Comment ⊗ Display descriptor cells (reached via (PROG)):
060
061 Many of these cells simply contain the output character sequences to carry out
062 certain functions on the terminal. In such Dpy Descriptor Cells, the chars
063 are stored in up to four 9-bit bytes (high-order byte is output first),
064 with the 400 bit of each byte flagging that that byte contains a char. It is
065 not legal to have a byte with the 400 bit on AFTER a higher-order byte that
066 has the 400 bit off -- the first byte with the 400 bit off indicates that there
067 are no more significant bytes in the word.
068
069 If the whole word of an output sequence cell contains zero, then that means
070 the given terminal cannot execute the given function. (Some functions are
071 required to be do-able by display terminals, other functions are optional.)
072
073 DPCNAM sixbit name of terminal
074 DPCPOS (LH) unused (RH) dispatch to routine to set arbitrary cursor position
075 DPCHOM output sequence to position cursor at Home (upper left)
076 DPCEOL output sequence to erase from cursor to end of line
077 DPCPRT output sequence to force next character to print
078 DPCADC output sequence to insert a character
079 DPCDLC output sequence to delete a character
080 DPCFLS output sequence to flush cursor
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 6.1␈↓'α
081 DPCRGH output sequence to move right one column
082 DPCLFT output sequence to move left one column
083 DPCUP output sequence to move up one row
084 DPCDWN output sequence to move down one row
085 DPCBEL output sequence to ring the terminal's bell
086 DPCERS output sequence to erase terminal's screen
087 DPCERB (LH) must be zero (RH) bits for terminal states cleared by erase screen
088 DPCADR output sequence to add (insert) a blank row
089 DPCDLR output sequence to delete a row
090 DPCCEM output sequence to clear emphasis
091 DPCSEM output sequence to enable emphasis
092 DPCMOD (LH) must be zero (RH) bits for modes that must be right before output
093 DPCBCL (LH) must be zero (RH) bits for modes cleared by DPCMCC sequence
094 DPCMCL output sequence to clear modes in DPCMDC
095 DPCID output sequence to enable Insert/Delete mode
096 DPCBLI output sequence to enable blinking
097
098 The standard ASCII commands CR and LF are assumed to behave normally on
099 all displays supported by this code. The CR is allowed to generate an
100 automatic LF provided it also makes the terminal ignore an immediately
101 following LF. This code will never send a CR without an immediately
102 following LF.
103
104 end of comment ⊗
105
106 NBTSEQ←←=9 ;Number of bits per character in output sequences.
107 ;The high-order bit is the valid bit -- consecutive chars
108 ;from the sequence are output until a char is found
109 ;that doesn't have the high-order bit on. See DMOUT1.
110
111 ;Macro to set up output sequence for carrying out a display terminal function.
112 DEFINE DPC(A,B,C,D)<
113 005 022 IFDIF <><D><BYTE (9)400!A,400!B,400!C,400!D
114 ;>IFDIF <><C><BYTE (9)400!A,400!B,400!C
115 ;>IFDIF <><B><BYTE (9)400!A,400!B
116 ;>IFDIF <><A><BYTE (9)400!A
117 >>;DPC ;Turns on 400 bit on all bytes up to last non-null one.
118
119 DEFINE XX'(NAM)<IFDEF DPC'NAM,<.FATAL Multiply defined Dpy Descriptor Cell name>
120 006 124 DPC'NAM←←.-DM2500> ;Defines the names of the table offsets.
121
122 ;Here is the Dpy Descriptor Table for the Datamedia 2500.
123 ;All other terminals must have their tables in the same order.
124 DM2500:
125 006 120 xx(NAM) 'DM2500';name of terminal
126 018 069 XX(POS) DM25CU ;dispatch address for cursor positioning routine
127 006 112 XX(HOM) DPC(2) ;home command
128 006 112 XX(EOL) DPC(27) ;erase to end of line cmd
129 006 112 XX(PRT) DPC(33) ;force next character to print
130 006 112 XX(ADC) DPC(34) ;insert a space (assumes ID mode on)
131 006 112 XX(DLC) DPC(10) ;delete a character (assumes ID mode on)
132 006 112 XX(FLS) DPC(14) ;flush cursor from screen
133 006 112 XX(RGH) DPC(34) ;move right one column
134 006 112 XX(LFT) DPC(10) ;move left one column
135 006 112 XX(UP) DPC(32) ;move up one row
136 006 112 XX(DWN) DPC(12) ;move down one row
137 006 112 XX(BEL) DPC(7) ;ring the terminal's bell
138 006 112 XX(ERS) DPC(37) ;erase whole screen
139 004 060 XX(ERB) 0,,BLNKON!PROTON!IDON ;bits for terminal states cleared by erase screen
140 006 112 XX(ADR) DPC(12) ;add (insert) a blank row
141 006 112 XX(DLR) DPC(32) ;delete a row
142 006 112 XX(CEM) DPC(30) ;clear emphasis
143 006 112 XX(SEM) DPC(16) ;enable emphasis (bold, assuming bold and blink are interchanged)
144 004 060 XX(MOD) BLNKON!PROTON!IDON ;bits for modes that must be right before output
145 004 060 XX(BCL) BLNKON!PROTON!IDON ;bits for modes cleared by DPCMCC sequence
146 006 112 XX(MCL) DPC(30) ;clear modes in DPCMDC
147 006 112 XX(ID) DPC(20) ;enable Insert/Delete mode
148 006 112 XX(BLI) DPC(17) ;enable blinking (assumes bold and blink are interchanged)
149
150 ;Here is the Dpy Descriptor Table for the HP 2648A.
151 HP2648:
152 'HP2648' ;name of terminal
153 018 081 HP26CU ;dispatch address for cursor positioning routine
154 006 112 DPC(33,"H") ;home command
155 006 112 DPC(33,"K") ;erase to end of line cmd
156 006 112 DPC() ;force next character to print
157 006 112 DPC(40) ;insert a space (assumes ID mode on)
158 006 112 DPC(33,"P") ;delete a character (assumes ID mode on)
159 006 112 DPC(33,"F") ;flush cursor from screen (home down)
160 006 112 DPC(33,"C") ;move right one column
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 6.2␈↓'α
161 006 112 DPC(10) ;move left one column
162 006 112 DPC(33,"A") ;move up one row
163 006 112 DPC(12) ;move down one row
164 006 112 DPC(7) ;ring the terminal's bell
165 006 112 DPC(33,"H",33,"J") ;erase whole screen
166 0 ;bits for terminal states cleared by erase screen
167 006 112 DPC(33,"L") ;add (insert) a blank row
168 006 112 DPC(33,"M") ;delete a row
169 006 112 DPC(33,"&","d","@") ;clear emphasis (reverse video)
170 006 112 DPC(33,"&","d","B") ;enable emphasis (reverse video)
171 004 061 BLNKON!IDON ;bits for modes that must be right before output
172 004 059 BLNKON ;bits for modes cleared by DPCMCC sequence
173 006 112 DPC(33,"&","d","@") ;clear modes in DPCMDC
174 006 112 DPC(33,"Q") ;enable Insert/Delete mode (for inserting chars)
175 006 112 DPC(33,"&","d","A") ;enable blinking
176
177 ;Here is the Dpy Descriptor Table for the Teleray 1000 series.
178 TELERAY:
179 'TELERA' ;name of terminal
180 018 109 TELECU ;dispatch address for cursor positioning routine
181 006 112 DPC(33,"H") ;home command
182 006 112 DPC(33,"K") ;erase to end of line cmd
183 006 112 DPC() ;force next character to print
184 006 112 DPC(33,"L") ;insert a space (assumes ID mode on)
185 006 112 DPC(33,"M") ;delete a character (assumes ID mode on)
186 006 112 DPC(33,"H") ;flush cursor from screen (home)
187 006 112 DPC(33,"C") ;move right one column
188 006 112 DPC(10) ;move left one column
189 006 112 DPC(33,"A") ;move up one row
190 006 112 DPC(12) ;move down one row
191 006 112 DPC(7) ;ring the terminal's bell
192 006 112 DPC(14) ;erase whole screen
193 0 ;bits for terminal states cleared by erase screen
194 006 112 DPC(33,"P") ;add (insert) a blank row
195 006 112 DPC(33,"Q") ;delete a row
196 0 ;clear emphasis (no emphasis possible, takes up char position)
197 0 ;enable emphasis ( " )
198 0 ;bits for modes that must be right before output
199 0 ;bits for modes cleared by DPCMCC sequence
200 0 ;clear modes in DPCMDC
201 0 ;enable Insert/Delete mode
202 0 ;enable blinking
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 7␈↓'α
001 ;DMXMT DMXMG2 DMXMGO DMXMT0 DMXMTP DMXDEQ DMXMT1 DMXMT9 DMXMT2 DMXM8L DMXM8C DMXM8U DMNOXY DMXMT8 NODPYH
; NODPYH
002
003 ↑DMXMT: PUSH P,J ;Preserve J throughout DMXMT
004 SKIPN J,LETAB(LINE)
005 007 119 JRST NODPYH ;Can't get here without a dpy header
006 PUSH P,[POPJJ] ;Restore J when POPJing
007 DMXMG2: SOSGE DMQKCT(J) ;Any quick (uninterruptible) chars ready?
008 007 012 JRST DMXMT0 ;No
009 DMXMGO: ILDB CHR,DMQKPT(J)
010 JRST TYPDM ;Yes, output one
011
012 DMXMT0: SKIPGE PADCNT(J) ;Do we now need to output some padding?
013 007 032 JRST DMXMTP ;Yes
014 SKIPGE RPTCNT(J) ;Is it time to repeat some sequence?
015 007 023 JRST DMXRPT ;Yes
016 HLL J,DPYBTS(J) ;Get display-dependent bits
017 SKIPN PROG,DPYDES(LINE) ;Get pointer to dpy descriptor block, more bits
018 PUSHJ P,NODPYD ;Oops, there isn't one!
019 PUSH P,[SCNONJ] ;Turn scanner on when done
020 OFFSCN ;But off while we diddle queue
021 007 048 JRST DMXMT1 ;Look for something to output
022
023 DMXRPT: AOS RPTCNT(J) ;Count another repeat done
024 MOVE CHR,RPTSIZ(J) ;Number of chars in repeating string, minus one
025 MOVEM CHR,DMQKCT(J) ;Set up quicky output, avoiding immediate SOS
026 MOVE CHR,RPTPTR(J) ;Get byte pointer to string to repeat
027 MOVEM CHR,DMQKPT(J) ;And store for quicky output
028 MOVE CHR,RPTPAD(J) ;Get any padding count
029 HLLM CHR,PADCNT(J) ;And set it up again
030 007 009 JRST DMXMGO ;Go output first char
031
032 DMXMTP: MOVSI CHR,1 ;Count one less padding char still needed
033 ADDB CHR,PADCNT(J) ;And send one now from RH of PADCNT
034 ANDI CHR,177 ;No extra bits please
035 JRST TYPDM
036
037 ;Any routine to be called when xfer is done (LH QFREE) better
038 ; preserve J,TAC,TAC1,DDB.
039 004 037 DMXDEQ: TLNE DAT,DMXLE
040 MOVEM DAT,DMLEFL(J) ;Line editor xfer--store flags in dpy hdr
041 004 033 TLNE DAT,USERGO ;Just finish uninterruptible user program?
042 SETOM DMXY(J) ;Yes, don't for sure know where cursor is
043 HLRZ AC1,QFREE(TAC) ;Get address of routine to run now
044 004 027 TLNE DAT,DMXCAL ;Does this queue entry have routine to call?
045 PUSHJ P,(AC1) ;Yes
046 PUSHJ P,DMDEQ ;Unqueue request that finished
047 HRRZS DMFLAG(J) ;No old output going
048 DMXMT1: MOVE DAT,DMFLAG(J) ;Get flags
049 004 020 TDNE DAT,[USERGO,,NOINTR!LEWAIT] ;Uninterruptible user program in progress?
050 007 062 JRST DMXMT2 ;Yes
051 HRRZ TAC,DMLEPT(J) ;Pointer to first LE incremental queue block
052 CAIE TAC,DMLEPT-QLINK(J) ;Header point to itself?
053 009 003 JRST DMXMTL ;No, output LE stuff
054 DMXMT9: HRRZ TAC,DMSPPT(J) ;Pointer to first special queue block
055 CAIE TAC,DMSPPT-QLINK(J) ;Header point to itself?
056 009 023 JRST DMXMTO ;No
057 SKIPE DPHOLD(J) ;Are we holding
058 007 062 JRST DMXMT2 ;Yes, don't do any PP output
059 HRRZ TAC,DMPPPT(J) ;Pointer to first PP queue block
060 CAIE TAC,DMPPPT-QLINK(J) ;Header point to itself?
061 009 023 JRST DMXMTO ;No
062 DMXMT2: HRRZ TAC,DMUSER(J) ;Pointer to first user program queue block
063 CAIE TAC,DMUSER-QLINK(J) ;Header point to itself?
064 009 008 JRST DMXMUS ;No
065 004 018 TRNE DAT,NOINTR ;Suppressing all non-user-program xfers?
066 007 111 JRST DMXMT8 ;Yes, no wholine, and don't reposition cursor
067 HRRZ TAC,DMWHO(J) ;Pointer to wholine queue block
068 CAIE TAC,DMWHO-QLINK(J) ;Header point to itself?
069 009 023 JRST DMXMTO
070 ;No more queued requests.
071 ;Now we will leave the cursor wherever user or the line editor wants it.
072 SETZ CHR, ;For PTYUUO which expects 0 to mean no output
073 SKIPL AC3,DMUSXY(J) ;Any user-specified position?
074 007 091 JRST DMXM8U ;Yes
075 DMXM8L: SKIPE LECLK(J) ;If line editor is still working,
076 007 111 JRST DMXMT8 ; don't bother moving cursor
077 MOVE AC3,CVP(J) ;Vertical position of LE cursor
078 007 104 SOJL AC3,DMNOXY ;LE counts lines from 1 but DM counts from 0
079 CAML AC3,DPYHGT(J) ;Is the vertical position on the screen?
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 7.1␈↓'α
080 007 104 JRST DMNOXY ;No, flush cursor
081 HRL AC3,CHP(J) ;Horizontal position of LE cursor
082 DMXM8C: CAMN AC3,DMXY(J) ;Is cursor already there?
083 007 111 JRST DMXMT8 ;Finally all done
084 008 032 PUSHJ P,DMSETQ ;Initialize quicky byte pointer and count
085 018 003 PUSHJ P,DMCURS ;Calculate FF,X,Y string to position cursor
086 MOVEM AC3,DMXY(J) ;Remember where we are putting cursor
087 MOVEM DAT,DMFLAG(J) ;Might have had to turn off ID mode (and others)
088 007 007 JRST DMXMG2 ;Now output a char
089
090 ;Here to leave cursor where user program wants it
091 DMXM8U: HRRZ AC1,PRGNUM(J) ;Get line number
092 MOVE IOS,DEVIOS(DDB) ;Maybe user program is not in charge of TTY
093 SKIPGE LETAB(AC1) ;Line initialized?
094 SKIPG CCPOS(J) ;Yes, cursor into line?
095 TLNE IOS,TPMON ;No, skip if user program in charge
096 007 075 JRST DMXM8L ;Yes, use line editor position
097 HLRZ AC1,AC3 ;Use user-specified cursor position
098 HRRZ AC2,AC3
099 CAMGE AC1,DPYWID(J) ;Check for legal X position
100 CAML AC2,DPYHGT(J) ;Check for legal Y position
101 007 104 JRST DMNOXY
102 007 082 JRST DMXM8C ;Ok, now position cursor as user requested
103
104 DMNOXY: MOVSI AC3,707070 ;Funny code to mark cursor gone (used here only)
105 CAMN AC3,DMXY(J) ;Cursor already gone?
106 007 111 JRST DMXMT8 ;Yes, and we are too now
107 MOVEM AC3,DMXY(J) ;No, but it will be in a moment
108 MOVE CHR,DPCFLS(PROG) ;Char to erase cursor
109 JRST TYPDM ;Put out one last char
110
111 DMXMT8: MOVSI IOS,IO!TOIP!IRMA
112 ANDCAB IOS,DEVIOS(DDB)
113 LDB J,PJOBN ;Get job number of tty's owner
114 JUMPN J,CPOPJ ;Don't kill tty if in use
115 TLNN LINE,TLKRNG ; nor if in talk ring
116 PUSHJ P,TTYKIL
117 POPJ P,
118
119 NODPYH: POP P,J
120 PUSHACS
121 PUSHJ P,DISGST ;PRINT TIME OF NEW MESSAGE ON CTY
122 PUSHJ P,DISMES
123 ASCIZ /NO DPY HEADER FOR DATAMEDIA LINE AT DMXMT.
124 /
125 PUSHJ P,DISFLU
126 POPACS
127 PUSHJ P,WDDTCA
128 JRST NODPY2
129
130 NODPYH: PUSHACS
131 PUSHJ P,DISGST ;PRINT TIME OF NEW MESSAGE ON CTY
132 PUSHJ P,DISMES
133 ASCIZ /No DPY DESCRIPTOR for DM line at DMXMT.
134 /
135 PUSHJ P,DISFLU
136 POPACS
137 PUSHJ P,WDDTCA
138 MOVEI PROG,DMDPYD ;Make this a normal DM 2500
139 MOVEM PROG,DPYDES(LINE)
140 POPJ P,
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 8␈↓'α
001 ;XYGET XYGET2 XYCHK DMSETQ
002
003 XYGET: SOSGE QDMCNT(TAC)
004 007 039 JRST DMXDEQ ;OOPS, end of entry.
005 008 021 PUSHJ P,XYCHK ;See if legal X char
006 CAML CHR,DPYWID(J)
007 TDZA AC1,AC1 ;Out of range, use column 0
008 MOVEI AC1,(CHR) ;Save X while checking Y
009 SOSGE QDMCNT(TAC)
010 007 039 JRST DMXDEQ ;OOPS, end of entry.
011 008 021 PUSHJ P,XYCHK ;See if legal Y char
012 CAML CHR,DPYHGT(J)
013 MOVEI CHR,0 ;Out of range, use line 0
014 HRL CHR,AC1
015 MOVEM CHR,QXY(TAC)
016 004 037 TLNN DAT,DMXLE
017 004 034 TLOA DAT,CHASTE ;New virgin output line waiting
018 MOVEM CHR,DMLEXY(J) ;Make sure line editor knows where we are
019 009 029 JRST DMXMT6
020
021 XYCHK: ILDB CHR,QTAKR(TAC) ;Get X or Y position
022 CAIL CHR,40
023 TRCA CHR,140
024 005 024 SKIPA AC2,DMTABL(CHR)
025 POPJ P,
026 AOS (P) ;Control-chars are out of range for both X and Y.
027 005 011 TLNN AC2,XYSPCL ;Is this a special char in X-Y position setting?
028 POPJ P, ;No
029 SUB P,[1,,1] ;Don't return to XYGET
030 011 021 JRST DMXMT4 ;Now go process this special char
031
032 ↑DMSETQ:MOVEI DSER,DMQKBF(J)
033 HRLI DSER,440700 ;Initialize byte pointer for storing quicky output
034 MOVEM DSER,DMQKPT(J) ;Set up taker byte pointer, too.
035 SETZM DMQKCT(J) ;No quickies yet
036 POPJ P,
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 9␈↓'α
001 ;DMXMTL DMXMUS DMXMTO DMXMTM DMLEM5 DMXMT6 DMXMT3 DMXMT5 DMTAB3 DMNOOP DMNOO2 DMXM5A DMXM5B DMXM5X DMCR2
; DMLF4 DMXM5D SKIPCR RANGE0 RANGE
002
003 DMXMTL: HLL DAT,DMLEFL(J) ;Get line editor flags
004 SKIPE LETXC(J) ;Has LE text already changed?
005 007 039 JRST DMXDEQ ;Yes, just dequeue this xfer
006 009 024 JRST DMXMTM
007
008 004 018 DMXMUS: TRNN DAT,NOINTR ;Want this xfer sent uninterruptibly?
009 009 023 JRST DMXMTO ;Nope, normal user xfer
010 HRL DAT,QFLAGS(TAC) ;Get flags for this xfer
011 004 028 TLNE DAT,DMQUOT ;Want to be interpreted?
012 004 039 TLZN DAT,DMUXFR ;No, have we already sent this xfer?
013 009 024 JRST DMXMTM ;Yes
014 HLRM DAT,QFLAGS(TAC) ;No, but note we will have in a moment
015 MOVE AC1,QTAKR(TAC) ;Get byte pointer to text of xfer
016 MOVEM AC1,DMQKPT(J) ; and use it for quickies
017 MOVE AC1,QDMCNT(TAC) ;Get byte count
018 MOVEM AC1,DMQKCT(J) ; and use it for quickies
019 SETOM DMXY(J) ;Note we have lost track of cursor
020 SETZM QDMCNT(TAC) ;Make sure xfer flushed when quicky buffer empties
021 007 007 JRST DMXMG2 ;All set up, now start transmitting quickies
022
023 DMXMTO: HRL DAT,QFLAGS(TAC) ;Get flags for this transfer
024 008 032 DMXMTM: PUSHJ P,DMSETQ ;Initialize quicky output byte ptr and byte count
025 004 036 TLNN DAT,DMATXY ;X-Y position stored in special word?
026 009 029 JRST DMXMT6
027 MOVE AC3,@QXYLOC(TAC) ;Yes, get X-Y position
028 DMLEM5: MOVEM AC3,QXY(TAC) ;Put into queue entry for use here
029 DMXMT6: SOSGE QDMCNT(TAC) ;Decrement number of characters in the entry
030 007 039 JRST DMXDEQ ;End of queue entry
031 DMXMT3: ILDB CHR,QTAKR(TAC) ;Get next character
032 009 029 JUMPE CHR,DMXMT6 ;Ignore null not preceded by 177
033 MOVE AC3,QXY(TAC) ;Save X-Y position we are supposed to be at.
034 CAIN CHR,177
035 011 008 JRST DM177 ;This is an escape or quoted char
036 004 028 TLNE DAT,DMQUOT ;Quoting most everything?
037 011 004 JRST DMXMT7 ;Yes
038 CAIL CHR,175
039 010 075 JRST DM175-175(CHR) ;Special dispatch on 175, 176
040 CAIN CHR,32
041 TRCA CHR,32≠176 ;Map Stanford tilde to ASCII tilde
042 CAILE CHR,40 ;Control char or space?
043 009 054 JRST DMXMT5 ;No, just update X-Y and send the char
044 005 024 SKIPGE AC2,DMTABL(CHR) ;This char automatically quoted?
045 011 021 JRST DMXMT4 ;Yes, output control char (or check for space)
046 CAIN CHR,"≠"
047 MOVEI CHR,32 ;Turn not-equals sign into ↑Z, to match input rep.
048 006 008 TLNE PROG,DM128 ;Can this DM tty display control characters?
049 004 068 JRST [ TRO CHR,DMTAPE ;Yes, use single-char tape mode to display char
050 009 054 JRST DMXMT5]
051 CAIG CHR,32
052 004 067 TROA CHR,140!CTRLCH ;Use lower case for control-letters
053 004 067 TRO CHR,100!CTRLCH ;Use "upper case" for control-funny-chars
054 DMXMT5: HLRZ AC2,AC3 ;Get column position
055 ADDI AC2,1
056 HRLM AC2,QXY(TAC)
057 DMTAB3: CAML AC2,DPYWID(J)
058 004 016 TRO DAT,RAPPED ;Moved past end of line
059 009 108 IFN FTRANGE,< JSP AC1,RANGE > ;Don't return if this is a user xfer out of range
060 018 133 DMNOOP: PUSHJ P,DMPREP ;Make sure cursor is at right place w/right modes
061 004 034 DMNOO2: TLZE DAT,CHASTE ;Any previous output on this line?
062 004 030 TLNE DAT,DMQUOT!NOEEOL ;No, suppressing erasures?
063 009 066 JRST DMXM5A ;Yes to one of these
064 MOVE AC2,DPCEOL(PROG) ;Erase to end-of-line char sequence
065 018 125 PUSHJ P,DMOUT1 ;Erase new line
066 004 068 DMXM5A: TRZN CHR,DMTAPE ;Is this a control char on DM that can display it?
067 009 070 JRST DMXM5B ;No
068 MOVE AC2,DPCPRT(PROG) ;Yes, tell terminal to print next char
069 018 125 PUSHJ P,DMOUT1 ;Output the char sequence
070 DMXM5B: IDPB CHR,DSER ;Put in real character (but don't count it)
071 004 016 DMXM5X: TRZN DAT,RAPPED ;Did we just pass last column on screen?
072 009 083 JRST DMXM5D ;No
073 AOS DMQKCT(J) ;Count following CR as quicky
074 004 029 TLNE DAT,TRUNCA ;Want to suppress stuff beyond last screen col?
075 010 004 PUSHJ P,IGNOR0 ;Yes, look for CR or LF--skip return unless hit CR
076 009 097 DMCR2: PUSHJ P,SKIPCR ;Skip over any following CRs and/or LF
077 MOVEI AC1,15 ;Clear DM hardware flags by sending actual CRLF now
078 IDPB AC1,DSER
079 AOS DMQKCT(J) ;Count following LF as quicky
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 9.1␈↓'α
080 017 003 PUSHJ P,DMCR3 ;Adjust X-Y position to beginning of next line
081 DMLF4: MOVEI AC1,12
082 IDPB AC1,DSER
083 DMXM5D: MOVEM DAT,DMFLAG(J) ;Save DM state flags
084 HLRM DAT,QFLAGS(TAC) ;Save transfer dependent flags
085 004 037 TLNE DAT,DMXLE
086 MOVEM DAT,DMLEFL(J) ;Line editor xfer--store flags in dpy hdr
087 MOVE AC1,QXY(TAC)
088 004 036 TLNE DAT,DMATXY ;Is X-Y position stored somewhere special?
089 MOVEM AC1,@QXYLOC(TAC) ;Yes, store X-Y position there
090 004 017 TRNE DAT,BELOW ;Is this transfer off screen?
091 007 048 JRST DMXMT1 ;Yes, don't output it, just look for more work
092 MOVEM AC1,DMXY(J) ;Save DM actual position
093 SKIPG DMQKCT(J) ;Did we set up any quickies?
094 JRST TYPDM ;No, just output one char
095 007 009 JRST DMXMGO ;Avoid one AOS and immediate SOS--output quickies
096
097 SKIPCR: SOSGE QDMCNT(TAC)
098 POPJ P, ;Nothing left in xfer
099 ILDB AC1,QTAKR(TAC)
100 CAIN AC1,15
101 009 097 JRST SKIPCR ;Ignore all CRs
102 CAIE AC1,12
103 010 028 JRST IGNFF ;Not CR or LF, put it back
104 POPJ P, ;Ignore one LF
105
106 IFN FTRANGE,<
107 RANGE0: HLRZ AC2,AC3 ;Get current column
108 004 039 RANGE: TLNE DAT,DMUXFR ;User program xfer?
109 004 061 TLNE DAT,IDON ;Yes, but don't suppress output in ID mode
110 JRST (AC1) ;Don't suppress
111 CAML AC2,DMBEG(J) ;Before beginning of range?
112 CAMLE AC2,DMEND(J) ;Or after end of range?
113 004 017 TROA DAT,BELOW ;Yes, out of range--flag xfer as off screen
114 JRST (AC1) ;Don't suppress
115 009 071 JRST DMXM5X ;Don't try to erase if suppressing output
116 >;FTRANGE
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 10␈↓'α
001 ;IGNOR0 IGNOR3 IGNOR2 IGNFF DMMAST DMERAS DMHOME DMBACK DMFOR2 DMFORW DM175 DM177B
002
003 ;Routine to skip text beyond last screen col until CR, LF, or FF. Skips on CR.
004 IGNOR0: AOS (P) ;Assume skip return
005 IGNOR3: SOSGE QDMCNT(TAC) ;Here to skip text beyond last screen col
006 POPJ P, ;Nothing to ignore
007 ILDB AC1,QTAKR(TAC)
008 CAIN AC1,15
009 SOSA (P) ;Direct return to skip any following CRs and/or LF
010 CAIN AC1,12
011 POPJ P, ;All done for sure
012 004 028 TLNE DAT,DMQUOT ;Quoting everything?
013 010 026 JRST IGNOR2 ;Yes
014 004 038 TLNN DAT,QUO177 ;Are 177's themselves quoted?
015 CAIE AC1,177 ;No, quoting next char?
016 010 005 JRST IGNOR3 ;No
017 SKIPG QDMCNT(TAC) ;Peek at char after 177 to look for FF
018 POPJ P, ;Nothing is being quoted
019 MOVE AC2,QTAKR(TAC)
020 ILDB AC1,AC2
021 CAIE AC1,14
022 010 005 JRST IGNOR3
023 010 028 JRST IGNFF ;Back up byte pointer and byte count over the 177
024
025 ;Here if quoting everything
026 IGNOR2: CAIE AC1,14
027 010 005 JRST IGNOR3 ;Loop back and ignore more
028 IGNFF: MOVSI AC1,070000
029 ADDM AC1,QTAKR(TAC) ;Back up byte pointer so we'll see same char again
030 AOS QDMCNT(TAC) ;Fix up count too
031 POPJ P,
032
033 ;For now, master clear just pretends tabs are gone and does erase of screen.
034 004 015 DMMAST: TRZ DAT,TBSSET ;This will clear all tabs, unfortunately
035 ;Here to erase display screen.
036 DMERAS: PUSHJ P,DMFORC ;Force whole wholine out next time
037 SETZM QXY(TAC) ;Back to home corner with all modes cleared
038 004 017 TDZ DAT,[BLNKON!PROTON!IDON,,BELOW]
039 TDZ DAT,DPCERB(PROG) ;Clear bits for terminal states cleared by erase
040 004 034 TLO DAT,CHASTE ;New virgin output line waiting
041 MOVE AC2,DPCERS(PROG) ;Get output sequence to erase screen
042 016 048 JRST DMLED1 ;Output it the usual way
043
044 DMHOME: SETZM AC1,QXY(TAC) ;Back to home corner with all modes cleared
045 004 061 TLZ DAT,BLNKON!PROTON!IDON
046 004 034 TLO DAT,CHASTE ;New virgin output line waiting
047 016 041 JRST DMFOR3 ;Store flags and maybe X-Y position
048
049 DPCDLC(PROG) ;Ptr to output seq to delete char if in ID mode
050 DMBACK: HLRZ AC2,AC3
051 009 029 SOJL AC2,DMXMT6 ;Can't back up past left margin, get next char
052 DMFOR2: HRLM AC2,QXY(TAC) ;Store new X position
053 004 036 TLNE DAT,DMATXY ;Is X-Y position stored somewhere special?
054 HRLM AC2,@QXYLOC(TAC) ;Yes, store new X position there
055 009 029 JRST DMXMT6 ;Get next char from this xfer
056 REPEAT 0,< ;For now we'll just remember where xfer wants the cursor
057 018 133 PUSHJ P,DMPREP ;Get cursor positioned to old place
058 MOVE AC2,DMCLFT(PROG) ;Get output sequence for moving left
059 018 125 PUSHJ P,DMOUT1 ;And output it
060 SOS DMQKCT(J) ;As usual, don't count one quicky
061 LDB CHR,DSER ; ...and get back last output char
062 009 083 JRST DMXM5D
063 >;REPEAT 0
064
065 DPCADC(PROG) ;Ptr to output seq to insert char if in ID mode
066 DMFORW: HLRZ AC2,AC3 ;Get current X position
067 ADDI AC2,1 ;Move right one column
068 CAMGE AC2,DPYWID(J) ;Does this make us pass end of line?
069 010 052 JRST DMFOR2 ;No, just store new X position
070 017 003 PUSHJ P,DMCR3 ;Back to col 0 on next line
071 MOVE AC1,QXY(TAC) ;Get new X-Y position for xfer
072 016 041 JRST DMFOR3 ;Store it in special place if necessary
073
074 ;The next two words are JRSTed to for output of chars 175, 176 respectively.
075 DM175: MOVEI CHR,45 ;175: Output altmode as dollar sign (44, sic)
076 009 054 SOJA CHR,DMXMT5 ;176: Right brace -- becomes ASCII 175
077
078 006 008 DM177B: TLNN PROG,NO177!DM128 ;Does this DM print 177s?
079 009 054 JRST DMXMT5 ;Yes, just send it
080 006 008 TLNE PROG,DM128 ;Can we precede it with a 033?
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 10.1␈↓'α
081 004 068 TROA CHR,DMTAPE ;Yes, flag it
082 004 067 MOVEI CHR,137!CTRLCH ;No, use inverted intensity left arrow
083 009 054 JRST DMXMT5 ;Now output it
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 11␈↓'α
001 ;DMXMT7 DM177 DMXM4A DMXMT4 DMCALC DMBELL DMCHPD DM30PD DM30PA DM30PB DM25PA DM25PB DMCALX DMPADM
002
003 ;Here if DMQUOT is on and char is neither 177 nor 0.
004 DMXMT7: CAIL CHR,40
005 009 054 JRST DMXMT5 ;Normal char, just output it
006 011 020 JRST DMXM4A
007
008 004 038 DM177: TLNE DAT,QUO177 ;177: Is it quoting next char?
009 010 078 JRST DM177B ;No, it is itself quoted--just send it
010 SOSGE QDMCNT(TAC) ;Here to quote next character
011 007 039 JRST DMXDEQ ;WHAT! Nothing there to quote!
012 ILDB CHR,QTAKR(TAC)
013 CAIN CHR,177
014 010 078 JRST DM177B ;Here we have a quoted 177
015 CAIGE CHR,175 ;Quotable text char?
016 CAIN CHR,40 ;Space can be quoted
017 009 054 JRST DMXMT5 ;Yes, update X-Y position and send char
018 CAIL CHR,OUTESC ;Control character or escape command?
019 009 029 JRST DMXMT6 ;No, ignore for now, allowing expansion of escapes
020 005 024 DMXM4A: MOVE AC2,DMTABL(CHR) ;Yes, dispatch to special routine
021 005 010 DMXMT4: TLNE AC2,IDSPCL ;Special char in I/D mode?
022 004 061 TLNN DAT,IDON ;Yes, are we in I/D mode?
023 JRST (AC2) ;No, go to special routine
024 018 133 PUSHJ P,DMPREP ;Make sure cursor and modes are correct
025 MOVE AC2,@-1(AC2) ;Get output sequence for insert/delete operation
026 018 125 PUSHJ P,DMOUT1 ;And output it
027 SOS DMQKCT(J) ;Don't count one quicky, as usual
028 005 024 MOVE AC2,DMTABL(CHR) ;Get bits for char again
029 LDB CHR,DSER ;Get back last quicky output char, for DMXM5D
030 006 007 TLNN PROG,PADID ;Need padding? (If so, assume DM 2500 algorithm)
031 009 083 JRST DMXM5D ;No
032 011 065 MOVEI AC1,DM25PA ;Routine to pad quick I/D operations on 2500
033 005 014 TLNE AC2,PDADDR ;ADD ROW char?
034 011 071 MOVEI AC1,DM25PB ;Yes, use routine to pad slower operation
035 DMCALC: LDB AC2,DMBAUD ;Get actual DMs running baud rate
036 JRST (AC1) ;Call routine to calculate padding
037
038 DMBELL: MOVE AC2,DPCBEL(PROG) ;Get bell-ringing output sequence
039 018 125 PUSHJ P,DMOUT1 ;Output it
040 LDB CHR,DSER ;Get back last char of sequence
041 SOS DMQKCT(J) ;Don't really count one quicky, as usual
042 LDB AC2,DMBAUD ;Get baud rate
043 IMULI AC2,=250 ;Pad for 250 msec
044 DMCHPD: IDIVI AC2,B10000 ;Make number of character transmission times
045 011 078 JUMPN AC3,DMCALX ;Jump if any remainder (use original char time)
046 011 078 SOJA AC2,DMCALX ;Minus one for the original char
047
048 REPEAT 0,< ;For now, use no padding on 3025s
049 011 055 DM30PD: MOVEI AC1,DM30PA ;Routine to pad quick I/D operations on 3025
050 005 015 TLNE AC2,PDADDR!PDDELR ;Add or delete row?
051 011 059 MOVEI AC1,DM30PB ;Yes, use routine from slower operations
052 011 035 JRST DMCALC ;Now calculate padding
053
054 ;Routine to calculate padding for ADD/DEL CHAR on DM 3025.
055 DM30PA: IMULI AC2,6 ;It takes 6 msec for the 3025 to do these ops
056 011 044 JRST DMCHPD
057
058 ;Routine to calculate padding for ADD/DEL ROW on DM 3025.
059 DM30PB: IMULI AC2,=130 ;It takes 130 msec for the 3025 to do these ops
060 011 044 JRST DMCHPD
061 >;REPEAT 0
062
063 ;Routine to calculate padding for all I/D ops except ADD ROW on DM 2500.
064 ;Pentti's algorithm for quick ops.
065 DM25PA: IMULI AC2,3 ;Takes 3 character transmission times at 9600
066 IDIVI AC2,BD9600 ;Divide by 9600 baud
067 011 078 SOJA AC2,DMCALX ;Minus one for the original char
068
069 ;Routine to calculate padding for ADD ROW on DM 2500.
070 ;Another Pentti Kanerva algorithm
071 DM25PB: MOVNI AC1,(AC3) ;Negative of number of lines above cursor
072 ADDI AC1,=24+6 ;Make it number of lines from here down + 6
073 IMUL AC2,AC1 ;Times baud rate
074 ; SUBI AC2,BD2400 ; minus 2400
075 ADDI AC2,BD9600+BD4800-1 - BD2400 ; minus 2400, but force ceiling rounding
076 IDIVI AC2,BD9600+BD4800 ;Divided by 14400
077 ;Padding calculation routines all exit through here
078 009 083 DMCALX: JUMPLE AC2,DMXM5D ;Jump if no padding needed
079 CAILE AC2,8 ;Quicky buffer has room for 8 (eg, expanding tab)
080 011 087 JRST DMPADM ;Lots of padding needed, use different method
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 11.1␈↓'α
081 ADDM AC2,DMQKCT(J) ;Count more quickies for padding
082 MOVE AC1,PADCNT(J) ;Padding char
083 IDPB AC1,DSER ;Put padding chars into quicky buffer
084 SOJG AC2,.-1
085 009 083 JRST DMXM5D
086
087 DMPADM: MOVNI AC2,(AC2) ;Make count negative
088 HRLM AC2,PADCNT(J) ;Set up arbitrary padding count
089 009 083 JRST DMXM5D
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 12␈↓'α
001 ;DMBETW DMBET2 DMTAB DMSPA9 DMSPA8 DMTABC
002
003 DMBETW: SOSGE QDMCNT(TAC)
004 012 012 JRST DMBET2 ;Oops, ran out of text
005 ILDB CHR,QTAKR(TAC) ;Get next char
006 CAIN CHR,11
007 POPJ P, ;Found ending tab
008 CAIN CHR,40
009 012 003 JRST DMBETW ;Ignore this space
010 012 003 JUMPE CHR,DMBETW ;Ignore nulls too
011 010 028 PUSHJ P,IGNFF ;Strange char, put it back
012 DMBET2: MOVEI CHR,11 ;Set up actual tab again
013 POPJ P,
014
015 004 032 DMTAB: TLNE DAT,BETWEE ;Want to skip spaces between tabs?
016 012 003 PUSHJ P,DMBETW ;Yes
017 DMSPA9: HLRZ AC1,AC3 ;Get column position
018 MOVEI AC2,10(AC1)
019 ANDI AC2,-10 ;Make it multiple of 8
020 HRLM AC2,QXY(TAC) ;Store new column position
021 CAIL AC1,=72
022 ;The following instr will fail to put out a quoted tab!!!!!
023 009 057 JRST DMTAB3 ;Wrapping around, omit tab and put out CRLF
024 ;Note--If this tab is quoted, we will very probably screw up X-Y position
025 ;iff the tab stops are not really where we expect them--tough.
026 004 028 TRNE DAT,TBSSET!DMQUOT ;Can we output actual tab?
027 009 057 JRST DMTAB3 ;Yes
028 MOVEI CHR,40 ;No, use spaces
029 SUBI AC1,-1(AC2) ; - (number of spaces needed - 1)
030 009 057 DMSPA8: JUMPE AC1,DMTAB3 ;If just one space, pretend normal space
031 009 108 IFN FTRANGE,< JSP AC1,RANGE > ;Don't return if this xfer is out of range
032 018 133 PUSHJ P,DMPREP ;Make sure cursor and modes are setup
033 HLRZ AC2,QXY(TAC) ;New column position
034 HLRZ AC1,AC3 ;Old column position
035 SUBI AC2,1(AC1) ;Number of spaces - 1
036 ADDM AC2,DMQKCT(J) ;Count all spaces but 1 as quickies
037 IDPB CHR,DSER
038 SOJG AC2,.-1 ;Put out 1 to 7 spaces (save one for later)
039 009 061 JRST DMNOO2
040
041 REPEAT 0,< ;Diddling tabs is no longer allowed.
042 004 015 DMTABC: TRZ DAT,TBSSET ;Someone is diddling our tabs--remember that
043 009 060 JRST DMNOOP ;But it doesn't move the cursor
044 >;REPEAT 0
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 13␈↓'α
001 ;DMSPAC DMSPA4 DMSPA2 DMSPA3
002
003 ;We don't get here with quoted spaces.
004 004 030 DMSPAC: TLNE DAT,NOEEOL ;Can we erase line and convert spaces to tabs?
005 009 054 JRST DMXMT5 ;Nope
006 TLC AC3,7
007 TLCE AC3,7 ;Only one space to next tab stop?
008 004 015 TRNN DAT,TBSSET ;Or tabs not set?
009 009 054 JRST DMXMT5 ;Yes to one of these
010 HLRZ AC2,AC3 ;Get previous X position
011 ADDI AC2,1 ;Update X position for first space
012 DMSPA4: SOSGE QDMCNT(TAC)
013 013 021 JRST DMSPA2 ;Nothing left in queue entry--go put out spaces
014 ILDB CHR,QTAKR(TAC)
015 CAIN CHR,11 ;If its a tab, just ignore preceding spaces
016 012 015 JRST DMTAB
017 CAIN CHR,40
018 013 026 JRST DMSPA3 ;Collect spaces until hit a tab stop
019 010 028 PUSHJ P,IGNFF ;Back up byte pointer and count over this last char
020 MOVEI CHR,40 ;Now go put out number of spaces we have accumulated
021 DMSPA2: HRLM AC2,QXY(TAC) ;Store new X position
022 HLRZ AC1,AC2 ;Number of "extra" spaces
023 MOVEI AC2,(AC2) ;New X position
024 012 030 JRST DMSPA8 ;Put out extras
025
026 DMSPA3: AOBJN AC2,.+1
027 TRNE AC2,7 ;Have we reached a tab stop?
028 013 012 JRST DMSPA4 ;No
029 MOVEI CHR,11 ;Yes, simulate these spaces with a tab
030 012 017 JRST DMSPA9
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 14␈↓'α
001 ;DMLEMV DMLEM2 DMLEM3 DMLEM4
002
003 ;Here to adjust cursor position for line editor.
004 004 037 DMLEMV: TLNN DAT,DMXLE ;Only valid for line editor xfer
005 009 029 JRST DMXMT6 ;Not legal otherwise
006 SOSGE QDMCNT(TAC)
007 007 039 JRST DMXDEQ ;Missing arg!
008 ILDB AC1,QTAKR(TAC) ;Get low-order bits of X adjustment
009 SOSGE QDMCNT(TAC)
010 007 039 JRST DMXDEQ ;Missing arg!
011 ILDB AC2,QTAKR(TAC) ;Get high-order bits of X adjustment
012 DPB AC2,[POINT 7,AC1,28];Combine bytes in AC1
013 TRNE AC1,1B22 ;Negative number?
014 IOR AC1,[-1B22] ;Yes, extend sign bit
015 HLRZ AC2,AC3 ;Get starting X position
016 ADD AC1,AC2 ;Adjust it
017 014 021 DMLEM2: JUMPGE AC1,DMLEM3 ;Jump unless moved past left margin
018 ADD AC1,DPYWID(J)
019 014 017 SOJA AC3,DMLEM2 ;Back up a line
020
021 DMLEM3: CAMGE AC1,DPYWID(J) ;Pass right margin?
022 014 026 JRST DMLEM4 ;No
023 SUB AC1,DPYWID(J)
024 014 021 AOJA AC3,DMLEM3 ;Move down a line
025
026 DMLEM4: HRL AC3,AC1 ;Combine new X and Y positions
027 MOVEM AC3,DMLEXY(J) ;Store new X-Y position in dpy hdr
028 009 028 JRST DMLEM5 ;Now store X-Y in queue entry and get another char
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 15␈↓'α
001 ;DMLEFX
002
003 ;Routine for line editor -- inserts or deletes some spaces away from cursor.
004 ;First arg is numbers of chars to insert or delete, with 100 bit on iff
005 ;deleting; 40 bit of first arg is high-order bit of offset, whose low
006 ;seven bits are in the second arg -- the offset from LE cursor where
007 ;inserting or deleting is to take place.
008 004 037 DMLEFX: TLNN DAT,DMXLE ;This is only legal if from line editor
009 009 029 JRST DMXMT6 ;Not legal otherwise
010 SOSGE QDMCNT(TAC)
011 007 039 JRST DMXDEQ ;Missing arg
012 ILDB AC2,QTAKR(TAC) ;Get first arg
013 TRZE AC2,100 ;Deleting or adding chars?
014 SKIPA CHR,DPCDLC(PROG) ;Wants to delete some chars
015 MOVE CHR,DPCADC(PROG) ;Adding chars
016 TRNN AC2,777630 ;Better not be any spurious bits on in the arg
017 SOSGE QDMCNT(TAC)
018 009 029 JRST DMXMT6 ;Bad first arg, or missing second arg
019 ILDB AC1,QTAKR(TAC) ;Get second arg, which is offset from LE cursor
020 TRZE AC2,40 ;Is offset bigger than fits in one byte?
021 IORI AC1,200 ;Yes, turn on high-order bit in offset
022 009 029 JUMPE AC2,DMXMT6 ;Zero correction count can't happen
023 PUSH P,AC2 ;Save the number of chars to insert or delete
024 HLRZ AC2,AC3 ;Get current X position
025 ADDI AC2,(AC1) ;Adjust it appropriately
026 CAMGE AC2,DPYWID(J) ;Did it go past end of screen?
027 JRST .+3 ;No
028 SUB AC2,DPYWID(J) ;Yes, wrap around to next line
029 AOJA AC3,.-3
030 HRL AC3,AC2 ;New X position back into position word for DMPREP
031 MOVEM AC3,QXY(TAC) ;Store it where DMXM5D will copy into DMXY
032 MOVEM DAT,DMLEFL(J) ;Store LE flags in case they have changed this xfer
033 004 037 TLZ DAT,DMATXY!DMXLE ;Don't let it store in DMLEXY, nor flags in DMLEFL
034 004 061 TLO DAT,IDON ;This xfer needs insert/delete mode
035 018 133 PUSHJ P,DMPREP ;Get us to proper position in proper mode
036 004 061 TLZ DAT,IDON ;Don't want I/D mode afterwards
037 MOVE AC2,CHR ;Sequence to output
038 POP P,CHR ;Get number of chars to insert or delete
039 018 125 PUSHJ P,DMOUT1 ;Put the insertions or deletions in quicky buffer
040 SOJG CHR,.-1
041 016 049 JRST DMLED2 ;Now go send all this stuff
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 16␈↓'α
001 ;DMLEDE DMPROT DMBLNK DMCANC DMID DMUP DMFOR3 DMEEOL DMLED1 DMLED2
002
003 ;Routine for deleting chars from line editor.
004 004 037 DMLEDE: TLNN DAT,DMXLE ;Only valid for line editor xfer
005 009 029 JRST DMXMT6 ;Not legal otherwise
006 004 061 TLO DAT,IDON ;This operation needs insert delete mode
007 018 133 PUSHJ P,DMPREP ;Make sure X-Y position and flags set up
008 004 061 TLZ DAT,IDON ;Now flush ID mode
009 SOSGE QDMCNT(TAC)
010 007 039 JRST DMXDEQ ;Oops, this ain't supposed to happen
011 ILDB AC1,QTAKR(TAC) ;Get count of chars to delete
012 SUBI AC1,1 ;Sequence is output once normally
013 MOVNM AC1,RPTCNT(J) ;Number of times to restart this string
014 MOVEM DSER,RPTPTR(J) ;Byte pointer to beginning of string
015 MOVN AC3,DMQKCT(J) ;Figure size of repeat string by change in count
016 MOVE AC2,DPCDLC(PROG) ;Get delete-character output sequence
017 018 125 PUSHJ P,DMOUT1 ;Output it to quicky buffer
018 ADD AC3,DMQKCT(J) ;-old+new = number of chars in repeat string
019 SUBI AC3,1 ;When repeating, first char isn't counted down
020 MOVEM AC3,RPTSIZ(J) ;Store size for each repetition
021 MOVE AC3,PADCNT(J) ;Pick up padding count, if any
022 MOVEM AC3,RPTPAD(J) ;And remember for repeated copies
023 016 049 JRST DMLED2 ;Uncount one output char, load last char, go.
024
025 004 060 DMPROT: TLOA DAT,PROTON ;Protected-field on mode
026 004 059 DMBLNK: TLO DAT,BLNKON ;Blink on mode
027 009 029 JRST DMXMT6
028
029 004 059 DMCANC: TLZ DAT,PROTON!BLNKON!IDON ;Clear all kinds of modes
030 009 029 JRST DMXMT6
031
032 004 061 DMID: TLO DAT,IDON ;Enter ID mode
033 009 029 JRST DMXMT6
034
035 DPCDLR(PROG) ;Ptr to output seq to delete row if in ID mode
036 DMUP: HRRZ AC1,AC3
037 009 029 SOJL AC1,DMXMT6 ;Can't move up from top line, get next char
038 HLL AC1,AC3 ;Maintain same X position
039 004 034 TLO DAT,CHASTE ;New virgin output line waiting
040 MOVEM AC1,QXY(TAC) ;Store new Y position
041 004 036 DMFOR3: TLNE DAT,DMATXY ;Is X-Y position stored somewhere special?
042 MOVEM AC1,@QXYLOC(TAC) ;Yes, store new Y position there
043 HLRM DAT,QFLAGS(TAC) ;Save transfer dependent flags
044 009 029 JRST DMXMT6 ;Get next char from this xfer
045
046 018 133 DMEEOL: PUSHJ P,DMPREP ;Make sure cursor is at right place
047 MOVE AC2,DPCEOL(PROG) ;Get erase-to-end-of-line output sequence
048 018 125 DMLED1: PUSHJ P,DMOUT1 ;And output it
049 DMLED2: SOS DMQKCT(J) ;As usual, don't count one quicky
050 LDB CHR,DSER ;Get back last character of quickies
051 009 083 JRST DMXM5D ;Now put out some quickies
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 17␈↓'α
001 ;DMCR3 DMLF2 DMLF3 DMCR4 DMCR DMLF DMLF1
002
003 DMCR3: HRRZS QXY(TAC) ;Back to column 0
004 DMLF2: HRRZ AC2,AC3 ;Get screen line number
005 ADDI AC2,1
006 004 033 TLNE DAT,USERGO ;Can only wrap around to top in uninterruptible user prog
007 CAMGE AC2,DPYHGT(J) ;To bottom of screen?
008 017 010 JRST DMLF3 ;No
009 MOVEI AC2,0 ;Wrap around to top
010 DMLF3: HRRM AC2,QXY(TAC) ;Save new line number
011 004 034 TLO DAT,CHASTE ;Mark new line as untouched
012 POPJ P,
013
014 018 133 DMCR4: PUSHJ P,DMPREP ;Make sure cursor and modes are correct
015 004 034 TLNE DAT,CHASTE ;Need to erase this line we are leaving?
016 004 031 TLNE DAT,DMQUOT!NOEEOL!NOEEOB ;Here with CR ending blank line
017 POPJ P, ;No
018 MOVE AC2,DPCEOL(PROG) ;Yes, do it
019 018 125 JRST DMOUT1 ;Output erase-to-end-of-line sequence
020
021 DMCR:
022 ;bugfix;HLL AC3,DMXY(J) ;We don't really care if X position is wrong
023 017 014 PUSHJ P,DMCR4 ;Erase line we are leaving, if necessary
024 009 076 JRST DMCR2
025
026 DPCADR(PROG) ;Ptr to output seq to insert row if in ID mode
027 004 037 DMLF: TLNN DAT,DMXLE
028 017 032 JRST DMLF1
029 004 030 TLO DAT,NOEEOL ;Don't ever erase any lines now
030 009 029 JRST DMXMT6 ;Ignore this bare LF from line editor
031
032 017 014 DMLF1: PUSHJ P,DMCR4 ;Erase line we are leaving, if necessary
033 017 004 PUSHJ P,DMLF2 ;Adjust Y position down a line
034 009 081 JRST DMLF4
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 18/0␈↓'α
001 ;DMCURS DMCUR2 DMXR2 DMOUT2 DMXL1 DMXR1 DMCUR4 DMYU2 DMYD1 DMYU1 DMCUR5 DPCBEG DM25CU HP26CU DPCEND TELE
;CU DMCUR3 DMOUT1 DMPREP DMPRE1 DMPR1A DMPRE2 DMPR2A DMPRE3 DMPRE4 DMPRE6 DMPR6A DMPRE7 DMPRE8
002
003 DMCURS: TLNE PROG,NOIDCU ;Skip is can't position while in ID mode
004 004 061 TRNN DAT,IDON ;Cannot position while in ID mode
005 018 010 JRST DMCUR2
006 004 061 TRZ DAT,BLNKON!PROTON!IDON
007 MOVEI AC1,CANCEL
008 IDPB AC1,DSER ;Turn 'em all off--it's the only way, sigh
009 AOS DMQKCT(J) ;Count a quicky
010 018 124 DMCUR2: JUMPE AC3,DMCUR3 ;If positioning to upper left corner, use home char
011 IFN 1,<
012 HRRZ AC1,DMXY(J) ;Old Y
013 HLRZ AC2,DMXY(J) ;Old X
014 CAIE AC1,(AC3) ;Right line?
015 018 038 JRST DMCUR4 ;No
016 HLRZ AC1,AC3 ;Yes, get new X
017 CAIN AC1,1(AC2)
018 018 034 JRST DMXR1 ;Need to move right one
019 CAIN AC1,-1(AC2)
020 018 033 JRST DMXL1 ;Need to move left one
021 CAIN AC1,2(AC2)
022 018 026 JRST DMXR2 ;Need to move right two
023 CAIE AC1,-2(AC2)
024 018 061 JRST DMCUR5
025 SKIPA AC2,DPCLFT(PROG) ;Need to move left two
026 DMXR2: MOVE AC2,DPCRGT(PROG) ;Move right
027 018 061 JUMPE AC2,DMCUR5 ;Jump if dump terminal can't move like that
028 DMOUT2: PUSH P,AC2
029 018 125 PUSHJ P,DMOUT1 ;Output it once
030 POP P,AC2
031 018 125 JRST DMOUT1 ;And output it again
032
033 DMXL1: SKIPA AC2,DPCLFT(PROG) ;Move left one
034 DMXR1: MOVE AC2,DPCRGT(PROG) ;Move right one
035 018 125 JUMPN AC2,DMOUT1
036 018 061 JRST DMCUR5 ;Dumb terminal can't move cursor that way
037
038 DMCUR4: HLRZ AC1,AC3 ;New X
039 CAIE AC1,(AC2) ;Right column?
040 018 061 JRST DMCUR5 ;No, must use cursor positioning command
041 HRRZ AC1,DMXY(J) ;Old Y
042 CAML AC1,DPYHGT(J) ;Is it beyond bottom of screen?
043 018 061 JRST DMCUR5 ;Yes, don't be fooled by having wrapped around
044 CAIN AC1,1(AC3)
045 018 058 JRST DMYU1 ;Need to move up one
046 CAIN AC1,-1(AC3)
047 018 057 JRST DMYD1 ;Need to move down one
048 CAIN AC1,2(AC3)
049 018 053 JRST DMYU2 ;Need to move up two
050 CAIE AC1,-2(AC3)
051 018 061 JRST DMCUR5
052 SKIPA AC2,DPCDWN(PROG) ;Need to move down two
053 DMYU2: MOVE AC2,DPCUP(PROG) ;Move up two
054 018 028 JUMPN AC2,DMOUT2
055 018 061 JRST DMCUR5 ;Dumb terminal can't move that way
056
057 DMYD1: SKIPA AC2,DPCDWN(PROG) ;Move down one
058 DMYU1: MOVEI AC2,DPCUP(PROG) ;Move up one
059 018 125 JUMPN AC2,DMOUT1
060 >;1
061 DMCUR5: HRRZ AC2,DPCPOS(PROG) ;Address of routine to call to position cursor
062 018 067 CAIL AC2,DPCBEG ;Make sure it is valid address
063 018 107 CAILE AC2,DPCEND
064 JRST DMCERR ;Invalid cursor dispatch!!!!!
065 JRST (AC2) ;Use positioning routine for specific terminal
066
067 DPCBEG:: ;Beginning of cursor positioning routines for various terminals
068 ;Cursor positioning routine for DM 2500. Outputs FF X Y.
069 DM25CU: XOR AC3,[140,,140] ;Convert X-Y position to char format
070 HLRZ AC2,AC3
071 MOVEI AC1,14
072 IDPB AC1,DSER ;FF
073 IDPB AC2,DSER ;X-Pos
074 IDPB AC3,DSER ;Y-Pos
075 XOR AC3,[140,,140] ;Restore position word
076 MOVEI AC1,3
077 ADDM AC1,DMQKCT(J) ;Count three quickies to be output
078 POPJ P,
079
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 18/0.1␈↓'α
080 ;Cursor positioning routine for HP 2648A. Outputs ESC & a 0 0 c 0 0 Y.
081 HP26CU: MOVEI AC1,33
082 IDPB AC1,DSER
083 MOVEI AC1,"&"
084 IDPB AC1,DSER
085 MOVEI AC1,"a"
086 IDPB AC1,DSER
087 HLRZ AC1,AC3 ;desired X position
088 IDIVI AC1,=10
089 ADDI AC1,"0"
090 IDPB AC1,DSER
091 ADDI AC2,"0"
092 IDPB AC2,DSER
093 MOVEI AC1,"c" ;column select just ended
094 IDPB AC1,DSER
095 MOVEI AC1,(AC3) ;desired Y position
096 IDIVI AC1,=10
097 ADDI AC1,"0"
098 IDPB AC1,DSER
099 ADDI AC2,"0"
100 IDPB AC2,DSER
101 MOVEI AC1,"Y" ;row select just ended
102 IDPB AC2,DSER
103 MOVEI AC1,9
104 ADDM AC1,DMQKCT(J) ;number of quickies we just inserted
105 POPJ P,
106
107 DPCEND:: ;Last cursor positioning routine for specific terminal
108 ;Cursor positioning routine for Teleray 1000 series. Outputs ESC Y x y.
109 TELECU: MOVEI AC1,33
110 IDPB AC1,DSER
111 MOVEI AC1,"Y"
112 IDPB AC1,DSER
113 HLRZ AC1,AC3 ;desired X position
114 ADDI AC1,40
115 IDPB AC1,DSER
116 MOVEI AC1,40(AC3) ;desired Y position, plus offset
117 IDPB AC1,DSER
118 MOVEI AC1,4
119 ADDM AC1,DMQKCT(J) ;number of quickies we just inserted
120 POPJ P,
121 ;Don't put arbitrary cursor positioning routines starting beyond DPCEND above.
122
123
124 DMCUR3: MOVE AC2,DPCHOM(PROG) ;Go to upper left corner
125 DMOUT1: TLZN AC2,400000
126 POPJ P, ;No char here, end of sequence
127 006 106 LSHC AC1,NBTSEQ ;Get next char in sequence into AC1
128 IDPB AC1,DSER ;Output one char of sequence
129 AOS DMQKCT(J) ;Count another quicky ready to go
130 018 125 JRST DMOUT1 ;Continue through sequence
131
132
133 DMPREP: HRRZ AC2,AC3 ;Get line number
134 CAML AC2,DPYHGT(J) ;Is it on screen?
135 004 017 DMPRE1: TROA DAT,BELOW ;No, set flag to suppress output of anything
136 004 017 TRZA DAT,BELOW
137 POPJ P,
138 004 035 TLNN DAT,PROTLE ;Want to avoid overwriting the line editor?
139 018 162 JRST DMPRE2 ;No
140 SKIPGE LETAB(LINE) ;Is the line editor non-empty?
141 SKIPL AC2,LEPOS(J) ;Yes, Is the line editor positioned by LEYPOS
142 018 162 JRST DMPRE2 ;No, go on
143 HRRZ AC1,LELINE(J)
144 SKIPN LECLK(J) ;Yes, is LELINE valid?
145 018 155 JRST DMPR1A ;Yes, use it
146 REPEAT 0,< ;DON'T DELETE THIS CODE -- IT MAY COME BACK SOMEDAY SOON
147 LDB AC1,[POINT 11,AC2,21] ;Get user-specified position
148 TRNE AC1,1⊗=10 ;Negative?
149 OR AC1,[-1⊗=10] ;Yes, extend sign
150 >;REPEAT 0
151 HRRE AC1,LEYVAL(J) ;GET 18-BIT LINE EDITOR Y-POSITION FROM LEYPOS
152 EXCH AC1,AC3
153 PUSHJ P,POSLD2 ;Convert to text line number
154 EXCH AC1,AC3 ;User line in AC1, current position into AC3
155 DMPR1A: HRRZ AC2,NCRS(J)
156 ADD AC2,AC1 ;Ending line of line editor
157 CAIG AC1,1(AC3)
158 CAIGE AC2,1(AC3)
159 018 162 JRST DMPRE2
␈↓&VDPSER.NEW[S,SYS] 09/05/79 Page 18/0.2␈↓'α
160 018 135 JRST DMPRE1 ;Don't really do the output
161
162 DMPRE2: CAME AC3,DMXY(J) ;Are we at correct initial cursor position?
163 018 003 PUSHJ P,DMCURS ;No, position cursor
164 HLRZ AC1,DAT ;See if modes are all set correctly
165 006 010 TLNE PROG,NOBOLD
166 018 169 JRST DMPR2A ;Poor guy has inferior DM, don't hypnotize him
167 004 037 TLNE DAT,DMXLE ;Line editor transfer?
168 004 059 XORI AC1,BLNKON ;Yes, invert blinkingness (ie, intensity)
169 004 067 DMPR2A: TRNE CHR,CTRLCH ;Is this a non-displayable control character?
170 004 059 XORI AC1,BLNKON ;Yes, we want the other mode of blinkingness
171 XORI AC1,(DAT)
172 AND AC1,DPCMOD(PROG) ;Keep only the mode bits that exist
173 JUMPE AC1,CPOPJ ;Any modes in wrong sense?
174 TRNN AC1,(DAT) ;Yes, any on that should be off?
175 018 179 JRST DMPRE3 ;No
176 TDZ DAT,DPCBCL(PROG) ;Yes, clear bits for modes this will clear
177 MOVE AC2,DPCMCL(PROG) ;Get output sequence to clear modes
178 018 125 PUSHJ P,DMOUT1 ;Clear terminal modes
179 004 060 DMPRE3: TLNE DAT,PROTON ;Skip unless want blinking
180 SKIPN AC2,DPCBLI(PROG) ;Skip if this terminal has blinking
181 018 184 JRST DMPRE4
182 004 060 TRON DAT,PROTON ;Skip if blinking already on
183 018 125 PUSHJ P,DMOUT1 ;Turn on blinking
184 004 061 DMPRE4: TLNE DAT,IDON ;Skip unless want ID mode
185 SKIPN AC2,DPCID(PROG) ;Skip if this terminal uses ID mode
186 018 189 JRST DMPRE6
187 004 061 TRON DAT,IDON ;Skip if ID mode already on
188 018 125 PUSHJ P,DMOUT1 ;Turn on ID mode
189 006 010 DMPRE6: TLNE PROG,NOBOLD
190 018 193 JRST DMPR6A ;Poor guy has inferior DM, don't hypnotize him
191 004 037 TLNE DAT,DMXLE
192 004 067 TRC CHR,CTRLCH ;Invert emphasis of line editor
193 004 067 DMPR6A: TRZN CHR,CTRLCH ;Is this a non-displayable control char?
194 018 199 JRST DMPRE7
195 004 059 TLNE DAT,BLNKON ;Yes, emphasize only if not normally emphasized
196 POPJ P, ;Normally emphasized, but not this time
197 018 200 JRST DMPRE8
198
199 004 059 DMPRE7: TLNE DAT,BLNKON ;Is emphasis supposed to be on for this xfer?
200 DMPRE8: SKIPN AC2,DPCSEM(PROG) ;Skip if this terminal has emphasis
201 POPJ P,
202 004 059 TRON DAT,BLNKON ;Skip if emphasis already on
203 018 125 PUSHJ P,DMOUT1 ;Turn on emphasis
204 POPJ P,
Symbol Table for: VDPSER.NEW[S,SYS] 09/05/79 Page I
BELOW ← 004 017 DMCR3 017 003 DMPRE2 018 162 DMXMT0 007 012 NEC600 003 111 RAPPED ← 004 016
BETWEE ← 004 032 DMCR4 017 014 DMPRE3 018 179 DMXMT1 007 048 NECCNV ← 003 382 RECDM 002*008
BLNKON ← 004 059 DMCUR2 018 010 DMPRE4 018 184 DMXMT2 007 062 NECDSP ← 003 380 RECDM0 002 024
C M 005 022 DMCUR3 018 124 DMPRE6 018 189 DMXMT3 009*031 NECHAR 003 407 RECDM2 002 085
CHASTE ← 004 034 DMCUR4 018 038 DMPRE7 018 199 DMXMT4 011 021 NECLR 003 092 RECDM3 002 057
CHRMA0 003 240 DMCUR5 018 061 DMPRE8 018 200 DMXMT5 009 054 NECMOD ← 003*359 RECDM4 002 078
CHRMA1 003 201 DMCURS 018 003 DMPREP 018 133 DMXMT6 009 029 NECNUM ← 003 376 RECDM5 002 052
CHRMA2 003 208 DMEEOL 016 046 DMPROT 016 025 DMXMT7 011 004 NECQUO ← 003 378 RECDM6 002 082
CHRMA3 003 214 DMERAS 010 036 DMQES2 003 346 DMXMT8 007 111 NECSUP ← 003 389 RECDM7 002 086
CHRMA4 003 250 DMFOR2 010 052 DMQESC 003*339 DMXMT9 007*054 NECTRL ← 003 364 RECDM8 002 048
CHRMA5 003 253 DMFOR3 016 041 DMQUOT ← 004 028 DMXMTL 009 003 NECVBP 003 459 RECDM9 002*074
CHRMA6 003 218 DMFORW 010 066 DMSETQ 008 032 DMXMTM 009 024 NECVEC ← 003 391 RECNE2 003 062
CHRMA7 003 237 DMHOME 010 044 DMSPA2 013 021 DMXMTO 009 023 NEFLSH 003 093 RECNEA 003 074
CHRMA8 003 258 DMID 016 032 DMSPA3 013 026 DMXMTP 007 032 NEHOL1 003 105 RECNEC 003 052
CHRMA9 003 261 DMLED1 016 048 DMSPA4 013 012 DMXMUS 009 008 NEHOLD 003 097 RECNED 003 005
CHRMAC 003*181 DMLED2 016 049 DMSPA8 012 030 DMXR1 018 034 NEHTFL ← 003 354 RECNEE 003 086
CHRMAC 003*463 DMLEDE 016 004 DMSPA9 012 017 DMXR2 018 026 NEMBPT 003 369 RECNEM 003 115
CTRLCH ← 004 067 DMLEFX 015 008 DMSPAC 013 004 DMXRPT 007 023 NEMETA ← 003 363 RECNEN 003 081
DM128 ← 006 008 DMLEM2 014 017 DMSTAY ← 004*022 DMYD1 018 057 NEMMOD ← 003*358 RECNEQ 003 065
DM175 010 075 DMLEM3 014 021 DMTAB 012 015 DMYU1 018 058 NENUMB ← 003 361 RECNER 003 012
DM177 011 008 DMLEM4 014 026 DMTAB3 009 057 DMYU2 018 053 NEQMOD ← 003 357 RECNES 003 089
DM177B 010 078 DMLEM5 009 028 DMTABC 012*042 DPC M 006 112 NEQUOT ← 003 362 RECNEZ 003 078
DM2500 006 124 DMLEMV 014 004 DMTABL 005 024 DPCBEG 018 067 NESBPT 003 368 RECNM1 003 121
DM25CU 018 069 DMLF 017 027 DMTAPE ← 004 068 DPCEND 018 107 NETBPT 003*366 RECNM2 003 134
DM25PA 011 065 DMLF1 017 032 DMUMSK ← 004*064 GETMA1 003 287 NEUNH 003 106 RECNM3 003 138
DM25PB 011 071 DMLF2 017 004 DMUP 016 036 GETMAC 003*274 NO177 ← 006 009 RECNNE 003 018
DM30PA 011 055 DMLF3 017 010 DMUXFR ← 004 039 GETMAC 003*464 NOBOLD ← 006 010 RECNNQ 003 047
DM30PB 011 059 DMLF4 009 081 DMXCAL ← 004 027 HP2648 006*151 NODICU ← 006*014 RECNSP 003 022
DM30PD 011*049 DMMAST 010 034 DMXDEQ 007 039 HP26CU 018 081 NODPYH 007 119 RECQNC 003 028
DMATXY ← 004 036 DMMOD0 003 322 DMXL1 018 033 IDON ← 004 061 NODPYH 007 130 RECQSP 003 035
DMBACK 010 050 DMMOD1 003 327 DMXLE ← 004 037 IDSPCL ← 005 010 NOEDFL ← 003*353 RECQVC 003 041
DMBELL 011 038 DMMODE 003*300 DMXM4A 011 020 IGNFF 010 028 NOEEOB ← 004 031 SKIPCR 009 097
DMBET2 012 012 DMMODN 003 311 DMXM5A 009 066 IGNOR0 010 004 NOEEOL ← 004 030 TBSSET ← 004 015
DMBETW 012 003 DMNOO2 009 061 DMXM5B 009 070 IGNOR2 010 026 NOINTR ← 004 018 TELECU 018 109
DMBLNK 016 026 DMNOOP 009 060 DMXM5D 009 083 IGNOR3 010 005 PADID ← 006 007 TELERA 006*178
DMBPND ← 004*019 DMNOXY 007 104 DMXM5X 009 071 INQUOT ← 005 012 PDADDR ← 005 014 TRUNCA ← 004 029
DMCALC 011 035 DMOUT1 018 125 DMXM8C 007 082 LEWAIT ← 004 020 PDDELR ← 005 015 USERGO ← 004 033
DMCALX 011 078 DMOUT2 018 028 DMXM8L 007 075 MACMAX ← 003 179 PROTLE ← 004 035 VECTNM ← 003 405
DMCANC 016 029 DMPADM 011 087 DMXM8U 007 091 NAM ← 006 120 PROTON ← 004 060 XX M 006 119
DMCHPD 011 044 DMPR1A 018 155 DMXMG2 007 007 NBTSEQ ← 006 106 QUO177 ← 004 038 XYCHK 008 021
DMCONV ← 005 013 DMPR2A 018 169 DMXMGO 007 009 NEALLQ ← 003 356 RANGE 009 108 XYGET 008 003
DMCR 017 021 DMPR6A 018 193 DMXMT 007*003 NEBBPT 003 367 RANGE0 009*107 XYSPCL ← 005 011
DMCR2 009 076 DMPRE1 018 135
Cref of: VDPSER.NEW[S,SYS] 09/05/79 Page I
Key to types of symbol occurrences (Note references come last):
Dash - Reference. : - Label. ← - Assignment.
= - OPDEF or SYN. + - Macro. * - Block. # - Variable. ↑ - Global.
BELOW 004←017 009-090 009-113 010-038 018-135 018-136
BETWEE 004←032 004-064 012-015
BLNKON 004←059 006-139 006-144 006-145 006-171 006-172 010-038 010-045 016-026 016-029 018-006 018-168 018-170 018-195
018-199 018-202
C 005+022 005-025 005-026 005-028 005-029 005-030 005-032 005-034 005-038 005-039 005-040 005-047 005-048 005-050
005-052 005-054 005-055 005-059 006-113
CHASTE 004←034 008-017 009-061 010-040 010-046 016-039 017-011 017-015
CHRMA0 003:240 003-217
CHRMA1 003:201 003-203
CHRMA2 003:208 003-199 003-204
CHRMA3 003:214 003-218
CHRMA4 003:250 003-241 003-256
CHRMA5 003:253 003-243
CHRMA6 003:218 003-247 003-249 003-255
CHRMA7 003:237 003-233
CHRMA8 003:258 003-210
CHRMA9 003:261 003-211
CHRMAC 003:181 003:463
CTRLCH 004←067 009-052 009-053 010-082 018-169 018-192 018-193
DM128 006←008 009-048 010-078 010-080
DM175 010:075 009-039
DM177 011:008 009-035
DM177B 010:078 011-009 011-014
DM2500 006:124 006-120
DM25CU 018:069 006-126
DM25PA 011:065 011-032
DM25PB 011:071 011-034
DM30PA 011:055 011-049
DM30PB 011:059 011-051
DM30PD 011:049
DMATXY 004←036 009-025 009-088 010-053 015-033 016-041
DMBACK 010:050 005-032
DMBELL 011:038 005-031
DMBET2 012:012 012-004
DMBETW 012:003 012-009 012-010 012-016
DMBLNK 016:026 005-038
DMBPND 004←019
DMCALC 011:035 011-052
DMCALX 011:078 011-045 011-046 011-067
DMCANC 016:029 005-048
DMCHPD 011:044 011-056 011-060
DMCONV 005←013 002-062 005-027 005-050 005-051 005-054 005-055
DMCR 017:021 005-037
DMCR2 009:076 017-024
DMCR3 017:003 009-080 010-070
DMCR4 017:014 017-023 017-032
DMCUR2 018:010 018-005
DMCUR3 018:124 018-010
DMCUR4 018:038 018-015
DMCUR5 018:061 018-024 018-027 018-036 018-040 018-043 018-051 018-055
DMCURS 018:003 007-085 018-163
DMEEOL 016:046 005-047
DMERAS 010:036 005-055
DMFOR2 010:052 010-069
DMFOR3 016:041 010-047 010-072
DMFORW 010:066 005-052
DMHOME 010:044 005-026
DMID 016:032 005-040
DMLED1 016:048 010-042
DMLED2 016:049 015-041 016-023
DMLEDE 016:004 005-029
DMLEFX 015:008 005-030
DMLEM2 014:017 014-019
DMLEM3 014:021 014-017 014-024
DMLEM4 014:026 014-022
DMLEM5 009:028 014-028
DMLEMV 014:004 005-028
DMLF 017:027 005-034
DMLF1 017:032 017-028
DMLF2 017:004 017-033
DMLF3 017:010 017-008
DMLF4 009:081 017-034
Cref of: VDPSER.NEW[S,SYS] 09/05/79 Page II
DMMAST 010:034 005-054
DMMOD0 003:322 003-308 003-312
DMMOD1 003:327 003-324
DMMODE 003:300
DMMODN 003:311 003-305
DMNOO2 009:061 012-039
DMNOOP 009:060 012-043
DMNOXY 007:104 007-078 007-080 007-101
DMOUT1 018:125 009-065 009-069 010-059 011-026 011-039 015-039 016-017 016-048 017-019 018-029 018-031 018-035 018-059
018-130 018-178 018-183 018-188 018-203
DMOUT2 018:028 018-054
DMPADM 011:087 011-080
DMPR1A 018:155 018-145
DMPR2A 018:169 018-166
DMPR6A 018:193 018-190
DMPRE1 018:135 018-160
DMPRE2 018:162 018-139 018-142 018-159
DMPRE3 018:179 018-175
DMPRE4 018:184 018-181
DMPRE6 018:189 018-186
DMPRE7 018:199 018-194
DMPRE8 018:200 018-197
DMPREP 018:133 009-060 010-057 011-024 012-032 015-035 016-007 016-046 017-014
DMPROT 016:025 005-039
DMQES2 003:346 003-341
DMQESC 003:339
DMQUOT 004←028 004-064 009-011 009-036 009-062 010-012 012-026 017-016
DMSETQ 008:032 007-084 009-024
DMSPA2 013:021 013-013
DMSPA3 013:026 013-018
DMSPA4 013:012 013-028
DMSPA8 012:030 013-024
DMSPA9 012:017 013-030
DMSPAC 013:004 005-056
DMSTAY 004←022
DMTAB 012:015 005-033 013-016
DMTAB3 009:057 012-023 012-027 012-030
DMTABC 012:042
DMTABL 005:024 002-039 002-068 008-024 009-044 011-020 011-028
DMTAPE 004←068 009-049 009-066 010-081
DMUMSK 004←064
DMUP 016:036 005-050
DMUXFR 004←039 009-012 009-108
DMXCAL 004←027 007-044
DMXDEQ 007:039 008-004 008-010 009-005 009-030 011-011 014-007 014-010 015-011 016-010
DMXL1 018:033 018-020
DMXLE 004←037 007-039 008-016 009-085 014-004 015-008 015-033 016-004 017-027 018-167 018-191
DMXM4A 011:020 011-006
DMXM5A 009:066 009-063
DMXM5B 009:070 009-067
DMXM5D 009:083 009-072 010-062 011-031 011-078 011-085 011-089 016-051
DMXM5X 009:071 009-115
DMXM8C 007:082 007-102
DMXM8L 007:075 007-096
DMXM8U 007:091 007-074
DMXMG2 007:007 007-088 009-021
DMXMGO 007:009 007-030 009-095
DMXMT 007:003
DMXMT0 007:012 007-008
DMXMT1 007:048 007-021 009-091
DMXMT2 007:062 007-050 007-058
DMXMT3 009:031
DMXMT4 011:021 008-030 009-045
DMXMT5 009:054 009-043 009-050 010-076 010-079 010-083 011-005 011-017 013-005 013-009
DMXMT6 009:029 005-024 005-025 005-027 005-035 005-041 005-042 005-043 005-044 005-045 005-046 005-049 005-051 005-053
008-019 009-026 009-032 010-051 010-055 011-019 014-005 015-009 015-018 015-022 016-005 016-027 016-030 016-033
016-037 016-044 017-030
DMXMT7 011:004 009-037
DMXMT8 007:111 007-066 007-076 007-083 007-106
DMXMT9 007:054
DMXMTL 009:003 007-053
DMXMTM 009:024 009-006 009-013
DMXMTO 009:023 007-056 007-061 007-069 009-009
DMXMTP 007:032 007-013
DMXMUS 009:008 007-064
DMXR1 018:034 018-018
DMXR2 018:026 018-022
DMXRPT 007:023 007-015
DMYD1 018:057 018-047
Cref of: VDPSER.NEW[S,SYS] 09/05/79 Page III
DMYU1 018:058 018-045
DMYU2 018:053 018-049
DPC 006+112 006-120 006-127 006-128 006-129 006-130 006-131 006-132 006-133 006-134 006-135 006-136 006-137 006-138
006-140 006-141 006-142 006-143 006-146 006-147 006-148 006-154 006-155 006-156 006-157 006-158 006-159 006-160
006-161 006-162 006-163 006-164 006-165 006-167 006-168 006-169 006-170 006-173 006-174 006-175 006-181 006-182
006-183 006-184 006-185 006-186 006-187 006-188 006-189 006-190 006-191 006-192 006-194 006-195
DPCBEG 018:067 018-062
DPCEND 018:107 018-063
GETMA1 003:287 003-283
GETMAC 003:274 003:464
HP2648 006:151
HP26CU 018:081 006-153
IDON 004←061 006-171 009-109 010-038 010-045 011-022 015-034 015-036 016-006 016-008 016-032 018-004 018-006 018-184
018-187
IDSPCL 005←010 005-032 005-034 005-050 005-052 011-021
IGNFF 010:028 009-103 010-023 012-011 013-019
IGNOR0 010:004 009-075
IGNOR2 010:026 010-013
IGNOR3 010:005 010-016 010-022 010-027
INQUOT 005←012 002-044 002-050 002-055 005-027 005-054 005-055
LEWAIT 004←020 007-049
MACMAX 003←179 003-209
NAM 006←120 006-125
NBTSEQ 006←106 018-127
NEALLQ 003←356 003-022 003-315
NEBBPT 003:367 003-019 003-074
NEC600 003:111 003-410
NECCNV 003←382 003-059 003-072 003-435 003-455 003-456
NECDSP 003←380 003-054 003-407 003-410 003-414 003-428 003-436 003-437 003-438 003-439
NECHAR 003:407 003-007 003-441 003-447 003-450 003-453 003-459
NECLR 003:092 003-428
NECMOD 003←359
NECNUM 003←376 003-081 003-443 003-445 003-450
NECQUO 003←378 003-052 003-421 003-423 003-424 003-429 003-430
NECSUP 003←389 003-023 003-024 003-410 003-414
NECTRL 003←364 003-423 003-430
NECVBP 003:459 003-041 003-047 003-193 003-282
NECVEC 003←391 003-026
NEFLSH 003:093 003-436
NEHOL1 003:105 003-103
NEHOLD 003:097 003-414
NEHTFL 003←354 003-102
NEMBPT 003:369 003-018 003-334
NEMETA 003←363 003-429 003-430
NEMMOD 003←358
NENUMB 003←361 003-010 003-421
NEQMOD 003←357 003-012
NEQUOT 003←362 003-008 003-138 003-342 003-423 003-424 003-429 003-430
NESBPT 003:368 003-075 003-078 003-086 003-089 003-139 003-343
NETBPT 003:366
NEUNH 003:106 003-100
NO177 006←009 010-078
NOBOLD 006←010 018-165 018-189
NODICU 006←014
NODPYH 007:119 007:130 007-005
NOEDFL 003←353
NOEEOB 004←031 004-064 017-016
NOEEOL 004←030 004-064 009-062 013-004 017-016 017-029
NOINTR 004←018 007-049 007-065 009-008
PADID 006←007 011-030
PDADDR 005←014 005-034 011-033 011-050
PDDELR 005←015 005-050 011-050
PROTLE 004←035 004-064 018-138
PROTON 004←060 006-139 006-144 006-145 010-038 010-045 016-025 016-029 018-006 018-179 018-182
QUO177 004←038 010-014 011-008
RANGE 009:108 009-059 012-031
RANGE0 009:107
RAPPED 004←016 009-058 009-071
RECDM 002:008
RECDM0 002:024 002-017 002-021
RECDM2 002:085 002-046 002-051 002-056 002-059 002-061 002-063 002-067 003-063
RECDM3 002:057 002-054
RECDM4 002:078 002-070
RECDM5 002:052 002-041
RECDM6 002:082 002-069 003-095
RECDM7 002:086 002-066 002-076 003-109
RECDM8 002:048 002-043
RECDM9 002:074
RECNE2 003:062 003-076 003-084
Cref of: VDPSER.NEW[S,SYS] 09/05/79 Page IV
RECNEA 003:074 003-069 003-071
RECNEC 003:052 003-036 003-048
RECNED 003:005 002-029
RECNEE 003:086 003-082
RECNEM 003:115 003-051
RECNEN 003:081 003-011
RECNEQ 003:065 003-009 003-020
RECNER 003:012 003-087
RECNES 003:089 003-053
RECNEZ 003:078 003-065
RECNM1 003:121 003-135
RECNM2 003:134 003-140
RECNM3 003:138 003-123
RECNNE 003:018 003-029 003-039
RECNNQ 003:047 003-013 003-033
RECNSP 003:022 003-015
RECQNC 003:028 003-044
RECQSP 003:035 003-025
RECQVC 003:041 003-027
SKIPCR 009:097 009-076 009-101
TBSSET 004←015 010-034 012-026 012-042 013-008
TELECU 018:109 006-180
TELERA 006:178
TRUNCA 004←029 004-064 009-074
USERGO 004←033 004-064 007-041 007-049 017-006
VECTNM 003←405 003-200
XX 006+119 006-125 006-126 006-127 006-128 006-129 006-130 006-131 006-132 006-133 006-134 006-135 006-136 006-137
006-138 006-139 006-140 006-141 006-142 006-143 006-144 006-145 006-146 006-147 006-148
XYCHK 008:021 008-005 008-011
XYGET 008:003 005-036
XYSPCL 005←011 005-026 005-036 005-041 005-042 005-048 005-054 005-055 008-027